2009-03-12 31 views

Trả lời

72

Bạn muốn float.IsNaN(...). So sánh với NaN luôn trả về false, bất kể giá trị của phao là gì. Đó là một trong những điểm nổi bật.

Điều đó có nghĩa bạn có thể làm điều này:

if (f1 != f1) { // This conditional will be true if f1 is NaN. 

Trong thực tế, đó là chính xác như thế nào isNaN() hoạt động.

+36

Đó là điều đáng lo ngại :) – JaredPar

+3

Sau đó, NaN! = NaN? – alan2here

+0

Đó làNaN() không phải IsNaN() – AntonioCS

29

Hãy thử điều này:

if (float.IsNaN(fValue)) 
{ 
} 
7
if(float.isNaN(fValue)) 
{ 
} 
+0

Đây là câu hỏi C#. Không có phương thức như vậy 'isNaN' trên' Float' trong C#; đó là 'IsNaN', với số vốn "I". –

2
if (fValue.CompareTo(float.NaN) == 0) 

Lưu ý: Tôi biết, thread là chết.

12

Trong mã phê phán hiệu suất float.IsNaN có thể quá chậm vì nó liên quan đến FPU. Trong trường hợp đó bạn có thể sử dụng hệ nhị phân kiểm tra mặt nạ (theo IEEE 754 specification) như sau:

public static unsafe bool IsNaN (float f) 
{ 
    int binary = *(int*)(&f); 
    return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0); 
} 

Nó là nhanh hơn so với float.IsNaN 5 lần. Tôi tự hỏi tại sao Microsoft không thực hiện IsNaN theo cách như vậy. Nếu bạn không muốn sử dụng mã không an toàn bạn vẫn có thể sử dụng cấu trúc công đoàn như: nhanh

[StructLayout (LayoutKind.Explicit)] 
struct FloatUnion 
{ 
    [FieldOffset (0)] 
    public float value; 

    [FieldOffset (0)] 
    public int binary; 
} 

public static bool IsNaN (float f) 
{ 
    FloatUnion union = new FloatUnion(); 
    union.value = f; 

    return ((union.binary & 0x7F800000) == 0x7F800000) && ((union.binary & 0x007FFFFF) != 0); 
} 

Nó vẫn còn 3 lần so với IsNaN.

+1

"Tôi tự hỏi tại sao Microsoft không triển khai IsNaN theo cách như vậy". Bởi vì mã đó phụ thuộc vào nền tảng và sẽ phá vỡ ở nơi khác. –

+1

Cấu trúc dữ liệu dấu chấm động được mô tả trong IEEE 754 và không phụ thuộc vào nền tảng. Hơn nữa, kiểm tra trên vô cực được thực hiện trong .NET thông qua so sánh nhị phân, ví dụ: '((* (((int *) & f)) & 0x7fffffff) == 0x7f800000)'. –

+2

Cấu trúc _data dấu phẩy động là nền tảng độc lập, nhưng tính cuối cùng thì không. –

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