下午好,
从来没有用C#做过严肃的数学工作,我刚刚注意到让我困惑的事情......如果确实如此
double Test = Math.Sqrt(UInt64.MaxValue)
Run Code Online (Sandbox Code Playgroud)
等于4294967296.0,也就是说UInt32.MaxValue + 1,为什么会这样
ulong Test2 = UInt32.MaxValue * UInt32.MaxValue;
Run Code Online (Sandbox Code Playgroud)
等于1?乍一看,在我看来溢出发生在这里......但是为什么那个产品应该适合UInt64?
非常感谢你.
Cod*_*aos 10
第一个发生是因为double没有64个尾数位,但只有大约53个.所以在转换到期间UInt64.MaxValue将四舍五入UInt64.MaxValue+1到double.而Sqrt那显然是2 ^ 32.double可以(U)Int32精确地表示任何值,但是一些较大的64位整数不能表示为double.
第二个发生是因为你在转换之前进行乘法运算UInt64,即它发生了UInt32,这显然会溢出.至少投出一个操作数,UInt64问题就会消失.