如何控制双精度计算以避免C++;linux x86_64? 在Linux X8664中的C++代码中,我需要双精度计算(+或--)。p>
26.1000000000001-26+0.100000000000001 我得到: 200000000000000143 我想得到0.2如何控制双精度计算以避免C++;linux x86_64? 在Linux X8664中的C++代码中,我需要双精度计算(+或--)。p>,c++,algorithm,double,precision,rounding-error,C++,Algorithm,Double,Precision,Rounding Error,26.1000000000001-26+0.100000000000001 我得到: 200000000000000143 我想得到0.2 这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较小数点后的4位数字 这似乎是一个舍入错误 如何将计算精度限制在小数点后4位 为了避免开销,我不想调用任何函数 由于转换开销,我不想使用stringstream 还有更好的主意吗 谢谢如果您只想打印它,您可以使用printf(“%10.4lf”)。当然,您可以
这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较小数点后的4位数字 这似乎是一个舍入错误 如何将计算精度限制在小数点后4位 为了避免开销,我不想调用任何函数 由于转换开销,我不想使用stringstream 还有更好的主意吗
谢谢如果您只想打印它,您可以使用printf(“%10.4lf”)。当然,您可以根据需要更改精度。如果您只想打印它,可以使用printf(“%10.4lf”)。当然,您可以根据需要更改精度。计算精度很好。这是您试图控制的显示精度。如果使用
,则可以使用setprecision()
执行此操作;如果使用
则可以使用类似“%.4f”的格式化程序执行此操作
您已经在调用函数,因为您正在将结果显示为十进制强>
p.S.0.1
不能用float
、double
或任何二进制尾数格式精确表示。它被分解为(1/2)*(1/5)
,十进制1/5
是一个无限重复的二进制数字序列
p.p.S.去看看。这可能是你最大的希望。计算精度很好。这是您试图控制的显示精度。如果使用
,则可以使用setprecision()
执行此操作;如果使用
则可以使用类似“%.4f”的格式化程序执行此操作
您已经在调用函数,因为您正在将结果显示为十进制强>
p.S.0.1
不能用float
、double
或任何二进制尾数格式精确表示。它被分解为(1/2)*(1/5)
,十进制1/5
是一个无限重复的二进制数字序列
p.p.S.去看看。这可能是你最大的希望。如果你只对小数点后四位以内的相等感兴趣,那么将所有内容乘以10000并使用整数运算。(您可能需要在乘以10000后进行四舍五入。)如果您只对小数点后四位以内的相等感兴趣,请将所有内容乘以10000并使用整数运算。(乘以10000后可能需要四舍五入。)此处,显示格式不是导入,计算结果将用于某些if-else分支条件。所以,我只想用if-else条件比较小数点后的4位数字。哦,你的意思是显示格式不重要!好啊您可以尝试乘以10^(精度)[在您的情况下精度为4]。此处,显示格式不是导入,计算结果将用于某些if-else分支条件。所以,我只想用if-else条件比较小数点后的4位数字。哦,你的意思是显示格式不重要!好啊您可以尝试乘以10^(精度)[在您的情况下精度为4]。此处,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较十进制数字后的4位。@user100228您试图用二进制浮点来做的事情是不可能的。再多的舍入技巧也不会使二进制浮点上的十进制算法像magic一样工作。@user1002288您只需在所有浮点精度比较中添加一些magicepsilon
值。像if(a==b){}
转换成if(abs(a-b)<1e-4){}
。这是使用浮点算法可以做的最好的事情。在这里,显示格式不是导入,计算结果将用于某些if-else分支条件。因此,我只希望if-else条件比较十进制数字后的4位。@user100228您试图用二进制浮点来做的事情是不可能的。再多的舍入技巧也不会使二进制浮点上的十进制算法像magic一样工作。@user1002288您只需在所有浮点精度比较中添加一些magicepsilon
值。像if(a==b){}
转换成if(abs(a-b)<1e-4){}
。这是使用浮点算法可以做的最好的事情。