我试图了解浮点运算如何提供不同的输出。以下进行的测试结果为1;但是vb.net和c#提供不同的输出,而java提供不同的输出。它可能必须与编译器做一些事情我读What Every Computer Scientist Should Know About Floating-Point Arithmetic,但它令人困惑,有人可以用简单的语言解释吗?
VB.NET
Dim x As Single = 1.000001
Dim y As Single = 0.000001
Dim result = x - y
输出:0.9999999 Click here to see output C#也是如此
此外,在视觉工作室中观看变量时,结果的值与输出的值不同,在打印时修剪,只打印了7个9(可以理解),但我不明白他们的实际结果是 0.99999994
更新:好的,我对这个计算的完成方式更感兴趣(删除了java的东西)
答案 0 :(得分:2)
visual basic中的数字Single(或c#float)存储为IEEE 754-2008。 该号码以32位存储。第一位是下一个8位存储指数的符号,接下来的23位存储分数。
首先将数字的整数部分转换为基数2.然后将分数转换为基数2,并使用右指数移动数字以匹配此格式:
1. x1..x23 x 2 ^ e
其中x1到x23是小数部分中的位,e是指数。
例如,0.25被转换为:1.0 x 2 ^ -2
请注意,有效数字限制为23位。
在您的示例中,1.000001被转换为1.< 20 zeors> 101001 ...但是我们只能取前23位数字(1.< 20 zeors> 101)。然而,对于0.000001,我们可以从第一个1(即第20位)开始23位数,并使用指数-20并以更高的精度存储数字。