有什么办法既不失去精度又能得到价值?
Is there any way to not lose the precision and still get the value?
首先,我完全是 C 语言的初学者,之前有 Java 和 Python 的编程经验。该程序的目标是添加 2 个数字。在玩代码时,我遇到了精度问题。问题是在我添加 2 个数字时引起的 - 1 个是 float 数据类型,另一个是 double 数据类型。
代码:
#include <stdio.h>
int main() {
double b=20.12345678;
float c=30.1234f;
printf("The Sum of %.8f and %.4f is= %.8f\n", b, c, b+c);
return 0;
}
输出:
20.12345678 和 30.1234 的总和= 50.24685651
然而,正确的输出应该是:50.24685678
浮点值精确到小数点后 6 位,输出也是如此。
我尝试将值显式转换为 double 类型,但仍然没有用。
PS:当我将变量类型从float转换为double时,输出是精确的;但是有没有其他方法可以添加 float 和 double 整数而不弄乱它们的数据类型?
谢谢。
分配给 c
的值无法准确表达,因此它被分配了下一个最接近的值。当打印到小数点后 4 位时你看不到,但如果你打印 8:
printf("The Sum of %.8f and %.8f is= %.8f\n", b, c, b+c);
输出:
The Sum of 20.12345678 and 30.12339973 is= 50.24685651
所以常量 30.1234f
对于您要进行的计算来说已经不够精确了。
float
仅保证 6 位十进制数字的精度,因此任何带有 float
的计算(即使其他操作数是 double
,即使您将结果存储到a double
) 只会精确到6位数字。
如果您需要更高的精度,请将自己限制在 double
或 long double
。如果您需要超过 10 位小数位的精度,那么您需要使用本机浮点类型和库函数以外的东西。您要么需要自己动手,要么使用像 GNU MP 这样的任意精度数学库。
首先,我完全是 C 语言的初学者,之前有 Java 和 Python 的编程经验。该程序的目标是添加 2 个数字。在玩代码时,我遇到了精度问题。问题是在我添加 2 个数字时引起的 - 1 个是 float 数据类型,另一个是 double 数据类型。
代码:
#include <stdio.h>
int main() {
double b=20.12345678;
float c=30.1234f;
printf("The Sum of %.8f and %.4f is= %.8f\n", b, c, b+c);
return 0;
}
输出:
20.12345678 和 30.1234 的总和= 50.24685651
然而,正确的输出应该是:50.24685678
浮点值精确到小数点后 6 位,输出也是如此。 我尝试将值显式转换为 double 类型,但仍然没有用。
PS:当我将变量类型从float转换为double时,输出是精确的;但是有没有其他方法可以添加 float 和 double 整数而不弄乱它们的数据类型? 谢谢。
分配给 c
的值无法准确表达,因此它被分配了下一个最接近的值。当打印到小数点后 4 位时你看不到,但如果你打印 8:
printf("The Sum of %.8f and %.8f is= %.8f\n", b, c, b+c);
输出:
The Sum of 20.12345678 and 30.12339973 is= 50.24685651
所以常量 30.1234f
对于您要进行的计算来说已经不够精确了。
float
仅保证 6 位十进制数字的精度,因此任何带有 float
的计算(即使其他操作数是 double
,即使您将结果存储到a double
) 只会精确到6位数字。
如果您需要更高的精度,请将自己限制在 double
或 long double
。如果您需要超过 10 位小数位的精度,那么您需要使用本机浮点类型和库函数以外的东西。您要么需要自己动手,要么使用像 GNU MP 这样的任意精度数学库。