2014-10-26 99 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