C#算术问题

Mig*_*uel 4 c# math overflow

下午好,

从来没有用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+1double.而Sqrt那显然是2 ^ 32.double可以(U)Int32精确地表示任何值,但是一些较大的64位整数不能表示为double.

第二个发生是因为你在转换之前进行乘法运算UInt64,即它发生了UInt32,这显然会溢出.至少投出一个操作数,UInt64问题就会消失.

  • @Miguel:我觉得你不需要-1.你犯了一个诚实的错误.问题已得到解答,就是这样. (6认同)
  • 这个问题已明确制定,所以我没有抱怨.我自己也犯了类似的错误. (3认同)