为什么新数字出现在双变量的末尾?
why new numbers appear at the end of double variable?
这是我的代码:
#include <stdio.h>
#include <math.h>
double Mul(double X,double Y,double Z)
{
Y=Y*pow(10,6);
Y=Y+Z;
X=(X*pow(10,12))+Y;
//X=114360000000000000+117239051145;
//X=Y;
return X;
}
int main()
{
double Hello=Mul(114360,117239,511432);
printf("%f",Hello);
return 0;
}
输出应该是“114360117239511432”,但我得到的是“114360117239511424” 我需要知道为什么 511432 转换为 511424?以及如何解决这个问题?
我建议熟悉 floating point inaccuracy. However you use decimal numbers as parameters, they are not integers. If you want to know more of the integer limits, please check the numeric limits。
让我更具体一点。如果指数不是 1,则 Double 类型变得不准确。我修改了您的代码,以显示确切的值。
double Mul(double X, double Y, double Z)
{
double YbutMore = Y * pow(10, 6);
// YbutMore = 117239000000.00000
double YandZ = YbutMore + Z;
// YandZ = 117239511432.00000
double Xpow12 = X * pow(10, 12);
// Xpow12 = 1.1436000000000000e+17
return Xpow12 + Y;
// returns 1.1436000000011723e+17
}
因此,当我们执行 X * pow(10, 12)
时,一切就开始了。尾数不能容纳这么大的数,所以指数不是 1
会导致不准确。不要忘记检查 double value memory model.
如果您对如何存储准确且大的数字感兴趣,请参阅How to store extremely large numbers?
这是我的代码:
#include <stdio.h>
#include <math.h>
double Mul(double X,double Y,double Z)
{
Y=Y*pow(10,6);
Y=Y+Z;
X=(X*pow(10,12))+Y;
//X=114360000000000000+117239051145;
//X=Y;
return X;
}
int main()
{
double Hello=Mul(114360,117239,511432);
printf("%f",Hello);
return 0;
}
输出应该是“114360117239511432”,但我得到的是“114360117239511424” 我需要知道为什么 511432 转换为 511424?以及如何解决这个问题?
我建议熟悉 floating point inaccuracy. However you use decimal numbers as parameters, they are not integers. If you want to know more of the integer limits, please check the numeric limits。
让我更具体一点。如果指数不是 1,则 Double 类型变得不准确。我修改了您的代码,以显示确切的值。
double Mul(double X, double Y, double Z)
{
double YbutMore = Y * pow(10, 6);
// YbutMore = 117239000000.00000
double YandZ = YbutMore + Z;
// YandZ = 117239511432.00000
double Xpow12 = X * pow(10, 12);
// Xpow12 = 1.1436000000000000e+17
return Xpow12 + Y;
// returns 1.1436000000011723e+17
}
因此,当我们执行 X * pow(10, 12)
时,一切就开始了。尾数不能容纳这么大的数,所以指数不是 1
会导致不准确。不要忘记检查 double value memory model.
如果您对如何存储准确且大的数字感兴趣,请参阅How to store extremely large numbers?