下午好,
从来没有用过 C# 来做严肃的数学工作,我刚刚注意到一些让我感到困惑的事情......如果这是真的
double Test = Math.Sqrt(UInt64.MaxValue)
等于 4294967296.0,也就是
UInt32.MaxValue + 1
,为什么会这样ulong Test2 = UInt32.MaxValue * UInt32.MaxValue;
等于1?乍一看,在我看来,这里发生了溢出……但为什么会这样,因为该产品应该适合
UInt64
?非常感谢你。
最佳答案
第一个发生是因为 double 没有 64 个尾数位,但只有 53 个左右。因此 UInt64.MaxValue
将在转换为 UInt64.MaxValue+1
期间四舍五入为 double
。而它的 Sqrt
显然是 2^32。 double
可以准确地表示来自 (U)Int32
的任何值,但一些较大的 64 位整数不能表示为 double
。
第二个发生是因为您在转换为 UInt64
之前进行乘法运算,即它发生为 UInt32
,这显然会溢出。将至少一个操作数转换为 UInt64
,问题就会消失。
关于C#算术题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5247814/