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
.
Nguồn
2012-02-20 10:56:40
Đó là điều đáng lo ngại :) – JaredPar
Sau đó, NaN! = NaN? – alan2here
Đó làNaN() không phải IsNaN() – AntonioCS