【发布时间】:2021-09-04 10:13:23
【问题描述】:
我有一个用 C 语言解决数学函数的问题。
double task1_double() {
double a = 1000;
double b = 0.0001;
double result = (pow((a + b), 2) - (pow(a, 2) + 2 * a * b))/(pow(b, 2));
return result; }
float task1_float() {
float a = 1000;
float b = 0.0001f;
float result = (powf((a + b), 2) - (powf(a, 2) + 2 * a * b))/(powf(b, 2));
return result; }
当我使用双精度数据类型时,它返回 1.001172,但使用浮点数据类型时,结果是 6250000.000000。
有人可以解释为什么会这样吗?提前致谢
【问题讨论】:
-
将复合表达式拆分为更简单的表达式,使用临时双精度来保存中间结果。打印出所有内容,从而缩小生成错误的范围。这称为“调试”。您还可以使用实际的调试器逐行跟踪执行,检查每个阶段的值。
-
我发现了一个问题,float b = 0.0001 节省了 9.99999975e-05,尽管节省了 0.0001。我可以修复它吗?
-
对所有内容都使用双精度。这将减轻但不会消除任何尝试(但失败)使用非无限 RAM 覆盖无限范围值的浮点表示的固有问题。
-
以防万一这是一个实际问题:公式在数学上简化为 1。
标签: c floating-point