为什么0.0001÷1655.45得到的值是6.040653e-8,而不是6.040654e-08呢?
但是0.0001÷359.99得到的值又变成了2.777855e-7,如果按之前取值规则应当是2.777854e-7才对
float型一共只有6-7位有效数字
超过这个数都是无效数字
你就不要纠结无效数字部分为什么会不对了
你想计算更精确,那就换成更大的类型
Fortran语言中的浮点数取值规则如下:
Fortran使用二进制浮点数表示浮点数值。浮点数由一个符号位、尾数和指数组成。
Fortran中默认使用双精度浮点数存储浮点数值,即64位。可以使用REAL
关键字声明单精度浮点数,即32位。
浮点数存储在计算机内存中时存在舍入误差,受到计算机内部表示和计算精度的限制。
浮点数的表示遵循IEEE标准,采用的是二进制浮点数表示法。
四舍五入并不是Fortran浮点数计算的取值规则。IEEE 754标准规定了不同的浮点数舍入模式,例如向零舍入、向上舍入、向下舍入等。
对于你提到的计算结果的问题,可能是由于四舍五入误差和浮点数的内部表示引起的。Fortran中的浮点数计算结果可能因为精度问题而出现偏差,例如你计算的0.0001÷1655.45结果是6.040653e-8而不是6.040654e-08,这可能是由于在进行计算时产生了舍入误差。同样,计算0.0001÷359.99结果是2.777855e-7而不是2.777854e-7也是类似的情况。
如何解决这样的问题取决于具体要求和计算场景。可以考虑使用更高精度的数据类型来进行计算,例如REAL*8
或DOUBLE PRECISION
。此外,可以使用一些技巧来处理舍入误差,例如调整计算顺序、增加计算精度等。
以下是一个示例代码,展示如何在Matlab中计算0.0001÷1655.45,并尝试调整计算精度:
a = 0.0001;
b = 1655.45;
% 使用默认格式进行计算
result_default = a / b;
% 使用双精度浮点数格式进行计算
format long
result_double = a / b;
% 使用更高精度的数据类型计算
format long
a_high_precision = single(a); % 单精度浮点数
b_high_precision = double(b); % 双精度浮点数
result_high_precision = a_high_precision / b_high_precision;
% 输出结果
result_default
result_double
result_high_precision
输出结果可能类似于:
result_default = 6.040653040853041e-08
result_double = 6.040653040853041e-08
result_high_precision = 6.040654e-08
注意:这里的结果可能因为系统和Matlab版本的不同而有所差异。因此,具体的解决方案还是要根据具体情况进行调整和优化。
你想知道的一切,都写在 IEEE浮点标准 里。