2014-10-26 97 views
1

什么是C#等效于C++我怎样才能获得双倍的符号位?

bool std::signbit(double arg); 

此功能的C++参考描述如下: 确定给定的浮点数arg是负的。 该函数检测零,无穷和NaN的符号位。与std :: copysign一起,这个宏是检查NaN符号的两种便携方式之一。

signbit(+0.0) = false 
signbit(-0.0) = true 
+0

不完全等效,但[此答案](http://stackoverflow.com/a/4739869/1430156)可能有所帮助。 – 2014-10-26 18:21:28

回答

4

我不知道是否有一个内置的,但这应该工作:基于this answer by Jon Skeet

private static readonly long SignMask = BitConverter.DoubleToInt64Bits(-0.0)^
    BitConverter.DoubleToInt64Bits(+0.0); 

public static bool signbit(double arg) 
{ 
    return (BitConverter.DoubleToInt64Bits(arg) & SignMask) == SignMask; 
} 

2

逆向工程从微软CRT机器代码,保持快速:

public unsafe static bool stdsign(double d) { 
     ushort* pd = (ushort*)&d; 
     return (pd[3] & 0x8000) != 0; 
    } 

通过了所有我知道如何在它扔了测试。假设小端结构。

+0

+1,尽管我宁愿避开“不安全”的代码。 (我怀疑我的效率会降低。) – Deduplicator 2014-10-26 20:48:38

+0

我对英特尔代码的奇怪感到有些沮丧。不知道他们为什么这样做。 – 2014-10-26 21:05:59

+0

是的。如果他们真的需要这样做,为什么他们不使用'ulong *'或'byte *'...... – Deduplicator 2014-10-26 21:09:10