2017-09-18 31 views
7

Tôi cần kiểm tra các phao không hữu hạn và loại bỏ chúng. Tôi đã định sử dụng math.IsInf() để kiểm tra phao nhưng tôi đã thấy một số ppl sử dụng math.IsNaN() cho mục đích này. Là một trong những tốt hơn cho mục đích này hơn khác? và nếu vậy thì sao?Điều nào là tốt hơn để thử nghiệm cho các float không phải là IsNaN hoặc IsInf?

chỉnh sửa: Điều này đã bị hoãn vì không rõ ràng ở đây, đây là thông tin bổ sung sẽ làm rõ câu hỏi. Tôi đã thực hiện bài tập 3.1 từ "Ngôn ngữ lập trình đi" tham chiếu đến số program này. Bài tập yêu cầu

Nếu hàm f trả về giá trị float64 không hữu hạn, tệp SVG sẽ chứa các phần tử không hợp lệ (mặc dù nhiều trình xử lý SVG xử lý> điều này một cách duyên dáng). Sửa đổi chương trình để bỏ qua đa giác không hợp lệ.

Tôi đã bào để giải quyết nó bằng cách thêm dòng sau vào góc func

if math.IsInf(z, 0) { 
    return math.NaN(), math.NaN() 
}  

và thay đổi các nội dung của thứ hai vòng lặp for trong chính để

ax, ay := corner(i+1, j) 
if math.IsNaN(ax) { 
    continue 
} 
bx, by := corner(i, j) 
if math.IsNaN(bx) { 
    continue 
} 
cx, cy := corner(i, j+1) 
if math.IsNaN(cx) { 
    continue 
} 
dx, dy := corner(i+1, j+1) 
if math.IsNaN(dx) { 
    continue 
} 
fmt.Printf("<polygon points='%g,%g %g,%g %g,%g %g,%g'/>\n", 
      ax, ay, bx, by, cx, cy, dx, dy) 

Tôi muốn kiểm tra công việc của tôi vì vậy tôi quyết định tìm kiếm bất kỳ câu trả lời nào khác ppl đã đăng trực tuyến cho vấn đề này. Không ai khác mà tôi thấy đã sử dụng math.IsInf() trong đó giải pháp nhưng hầu hết đã sử dụng math.IsNaN(). Điều này làm cho tôi tự hỏi nếu tôi đã mất tích một cái gì đó và nếu math.IsNaN() là tốt hơn cho mục đích này vì một lý do nào đó. Vì vậy, tôi đã xem qua Go Documents cho cả hai chức năng. Tôi tìm kiếm NaN trên wikipedia và IEEE 754. Tôi đã tìm kiếm trên web chung vì sao mọi người khác lại sử dụng math.IsNaN() mặc dù nó dường như ít trực quan hơn đối với tôi. Sau đó, tôi đã tìm kiếm ở đây và trên stackoverflow cho câu trả lời sau khi tất cả những điều đó tôi đã không thực sự có một câu trả lời vì vậy tôi quyết định đăng một câu hỏi.

+3

Bạn có biết những điểm nổi vô hạn và NaN là gì không? – user2357112

+0

@ user2347112 - Khi tôi hiểu nó, NaN có nghĩa là Không phải là một số và biểu thị các câu trả lời cho những thứ như 0/0, một số tới một sức mạnh tiêu cực hoặc vô cùng. Infinity là bất kỳ số nào từ lâu để được biểu diễn bằng phao. ít nhất đây là những gì nghiên cứu của tôi đã dẫn tôi tin cho đến nay. – sjtwiv

+7

Thử nghiệm IsInf cho vô cực hoặc âm. Các thử nghiệm IsNaN cho NaN. Nếu bạn cần một hoặc cả hai bài kiểm tra đó, hãy sử dụng chức năng hoặc chức năng làm những gì bạn cần. – user2357112

Trả lời

4

Nếu bạn chỉ cần tính đến các thông tin vô tuyến thì math.IsInf() là đủ. Tuy nhiên, nếu bạn cần bảo vệ chống lại cả thông tin và giá trị không phải là số, bạn nên sử dụng cả hai kết hợp.

Để đọc thêm về nổi: https://en.wikipedia.org/wiki/IEEE_754

Một ví dụ về math.IsNaN() không làm việc cho các giá trị vô hạn: https://play.golang.org/p/blHjr8i7p9

-2

toán học nói, thật lạ rằng NaN là một điều trong chương trình vì biểu thức không hợp lệ không nên biên dịch (không may họ tuy nhiên).

Sử dụng math.IsNaN() nếu số của bạn sẽ không vừa với dòng thực (ví dụ như sqrt (-1)) hoặc nếu nó không được xác định về mặt toán học (như 0/0).

Sử dụng math.IsInf() nếu số của bạn có thể thực sự lớn (theo hướng dương hoặc âm) sao cho bạn không có đủ bit để đại diện cho nó, hoặc nếu nó thực sự là vô cùng.

+2

Biểu thức có thể hợp lệ nhưng vẫn tạo ra kết quả vô nghĩa (ví dụ: chia cho không). Làm thế nào để bạn đề xuất để giải quyết sự kỳ quặc này mà không đánh giá toàn bộ chương trình? Đây chỉ là vấn đề tạm dừng trong ngụy trang: https://en.wikipedia.org/wiki/Halting_problem – blz

+0

Cảm ơn bạn đã downvoting, nhưng việc chia cho 0 cũng là một biểu thức không hợp lệ mà không biên dịch (hoặc ít nhất là tạo ra lỗi thời gian chạy, ví dụ NaN) ... Bạn có quen thuộc với giới hạn toán học không? Dù sao, các ngôn ngữ lập trình thông minh hơn đang ở trên đường chân trời (nhưng khó có thể sớm nhận thấy sự chấp nhận chính thống). Bạn sẽ muốn các loại phụ thuộc của google và/hoặc lập trình hàm tổng số. –

+1

downvote không phải là từ tôi :) Tôi hiểu giới hạn toán học tốt - bạn có hiểu tại sao phân tích thời gian biên dịch không thể làm những gì bạn muốn nó làm? Bạn có hiểu làm thế nào đây chỉ là vấn đề tạm dừng trong ngụy trang? Ví dụ đơn giản: '1/randint (0, 10)'. Biên dịch này có nên không? Làm thế nào về ví dụ này: '1/int (user_input (" nhập một chữ số "))'? Các lựa chọn của bạn là (a) từ chối biên dịch vì bạn * có thể * lấy một '0' hoặc (b) tạo ra một' NaN' nếu bạn nhận được giá trị '0' khi chạy. – blz

Các vấn đề liên quan