我怎样才能获得双倍的符号位?

时间:2014-10-26 18:14:16

标签: c# double std

什么是C ++的C#等价物

bool std::signbit( double arg );

此函数的C ++参考描述如下: 确定给定的浮点数arg是否为负数。 此函数检测零,无穷大和NaN的符号位。与std :: copysign一起,这个宏是检查NaN符号的唯一两种可移植方式之一。

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

2 个答案:

答案 0 :(得分:4)

我不确定是否有内置功能,但这应该有效:

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;
}

基于this answer by Jon Skeet

答案 1 :(得分:2)

从Microsoft CRT中的机器代码进行反向设计,保持快速:

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

通过我知道如何投掷的所有测试。假设小端架构。