Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的奇异减法#_C#_Math - Fatal编程技术网

C# c语言中的奇异减法#

C# c语言中的奇异减法#,c#,math,C#,Math,我正在做一个c#程序。。我必须做一个简单的数学运算 72057594037927936.0 - 255.0 = ..... 两个数字都是双倍的。。。我得到 72057594037927680.0 而不是 72057594037927681.0 谁能解释一下这怎么可能 Thanx减法的精确结果 72057594037927681 = 0xffffffffffff01 需要56位精度,但double只有53位,因此结果被四舍五入到最接近的可表示数字。减法的精确结果 72057594037

我正在做一个c#程序。。我必须做一个简单的数学运算

72057594037927936.0 - 255.0 = .....
两个数字都是双倍的。。。我得到

72057594037927680.0 
而不是

72057594037927681.0 
谁能解释一下这怎么可能


Thanx

减法的精确结果

72057594037927681 = 0xffffffffffff01

需要56位精度,但double只有53位,因此结果被四舍五入到最接近的可表示数字。

减法的精确结果

72057594037927681 = 0xffffffffffff01

需要56位精度,但double只有53位,因此结果被四舍五入到最接近的可表示数字。

因为浮点数的精度有限。从大数字中加/减小数字可能会导致舍入错误

如果您将代码转换为使用的(更精确,但范围更小),您将得到预期的答案:

// using doubles
72057594037927936.0 - 255.0 // 72057594037927680.0

// using decimals
72057594037927936.0m - 255.0m // 72057594037927681.0m

因为浮点数的精度有限。从大数字中加/减小数字可能会导致舍入错误

如果您将代码转换为使用的(更精确,但范围更小),您将得到预期的答案:

// using doubles
72057594037927936.0 - 255.0 // 72057594037927680.0

// using decimals
72057594037927936.0m - 255.0m // 72057594037927681.0m

我们可以用某种过滤器来检测浮点错误问题吗?这实际上是有史以来最常见的编程问题,但在这种形式下,它有点难以自动检测。多亏了duffymo的评论,Goldberg的文章是浮点问题的基本读物。这个问题并没有困扰我。也许如果我在这里回答问题的时间更长,我会发现这是多余的。但它写得非常干净。标题可能需要改进。我们可以用某种过滤器来检测浮点错误问题吗?这实际上是有史以来最常见的编程问题,但在这种形式下,它有点难以自动检测。多亏了duffymo的评论,Goldberg的文章是浮点问题的基本读物。这个问题并没有困扰我。也许如果我在这里回答问题的时间更长,我会发现这是多余的。但它写得非常干净。标题可能需要改进。祝贺你们在100K RP:)祝贺你们在100K RP:)特别有用,因为你们提到小数作为替代。荣誉特别有用,因为你提到小数作为替代。荣誉