gpt4 book ai didi

floating-point - 如何正确地舍入一个非常小的负数?

转载 作者:行者123 更新时间:2023-12-02 22:00:24 24 4
gpt4 key购买 nike

有一个非常小的负数,例如 -0.123e-35 我们从之前的计算中得到。该数字可能会用在其他一些公式中。将这个数字四舍五入到十位小数到零“0”是正确的方法吗?如果这个数字只用在加法运算中就没问题,但在乘法运算中会给出错误的结果。怎样做才是正确的?

UPD

为什么需要我?我在矩阵上实现了DCT方法。在由“1”填充的测试矩阵 8x8 上。我明白了:

8 -7.49778027488703e-13 7.64321008887262e-13 -7.90698562193149e-13 8.26182651759402e-13 -8.78937758371177e-13 9.51152198392764e-13 -1.04158952401295e-12
-7.51721016906324e-13 1.66533453693773e-16 -2.77555756156289e-17 2.77555756156289e-17 2.77555756156289e-17 2.77555756156289e-17 -2.77555756156289e-17 1.38777878078145e-17
7.65773344411544e-13 2.77555756156289e-17 -1.38777878078145e-16 -2.77555756156289e-17 0 0 0 -1.38777878078145e-17
-7.91522860733958e-13 0 5.55111512312578e-17 -5.55111512312578e-17 -2.77555756156289e-17 -2.77555756156289e-17 -1.38777878078145e-17 -1.38777878078145e-17
8.26025642513534e-13 8.32667268468867e-17 -2.77555756156289e-17 0 0 5.55111512312578e-17 -6.93889390390723e-17 -6.93889390390723e-18
-8.78466730633572e-13 8.32667268468867e-17 -2.77555756156289e-17 -4.16333634234434e-17 1.11022302462516e-16 4.16333634234434e-17 -1.38777878078145e-17 5.55111512312578e-17
9.50946123757562e-13 -1.66533453693773e-16 -9.71445146547012e-17 2.77555756156289e-17 -9.71445146547012e-17 -1.38777878078145e-17 1.38777878078145e-17 -1.73472347597681e-17
-1.04131475783268e-12 -8.32667268468867e-17 4.16333634234434e-17 -4.16333634234434e-17 -1.38777878078145e-17 5.55111512312578e-17 2.77555756156289e-17 -4.16333634234434e-17

我也做了同样的事情,但在 Scilab 中,它给了我这个:

8.    0.    0.    0.    0.    0.    0.    0.  
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.

如您所见,只有零。我想知道我是否可以将这些非常小的负数四舍五入为零?

最佳答案

这里有很多答案建议您按照 (x * 10^n)/10^n 的方式做一些事情。但是,一般来说,这不会四舍五入到n 个小数位。

二进制 float 不能精确表示大多数有限小数,例如 0.1 实际上是 0.100000001490116...* 因此,如果您的目标是获得有限小数展开式的精确表示(例如后续计算),这种方法是行不通的;它只会为您提供与您的目标相符的最接近的可表示值。对于精确表示,您需要研究 BigDecimal 库/类(其详细信息因语言而异)。

但是,如果您只想显示 小数点后 10 位的值,那么您的语言可能会提供类似于 C 的 printf("%.10f\n", x) 的功能; 。出于显示目的,这确实会四舍五入到小数点后 10 位。


* 参见 http://floating-point-gui.de/初学者对这个重要问题的介绍。

关于floating-point - 如何正确地舍入一个非常小的负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com