kat*_*tta 6 c floating-point floating-accuracy
任何人都可以帮助我为什么x2打印零.我想因为浮点表示X1四舍五入,有没有办法保持进动.
long double x1, x2;
x1= 0.087912088; // Note: 360/4095 = 0.087912088
x2 = 360/4095;
printf("%Lf, %Lf \n",x1, x2);
Run Code Online (Sandbox Code Playgroud)
结果:
x1 =0.087912
x2= 0.000000
Run Code Online (Sandbox Code Playgroud)
Lev*_*von 10
问题是整数截断 ..你正在划分两个整数=>结果将是另一个整数,其中小数部分被抛弃.(例如,在整数除法的实际结果为3.9的情况下,截断将使其为3(即,它不会舍入)).
在您的情况下,如果您将其更改为:
x2 = 360 / 4095.0; /* one of the operands now has a decimal point */
Run Code Online (Sandbox Code Playgroud)
你会得到
0.087912, 0.087912
Run Code Online (Sandbox Code Playgroud)
作为输出.
即,只要除法运算符的一个或两个操作数/都是浮点数/双精度数,结果也是如此(即,它将被"提升"为浮点数/双精度数).所以,我可以改变x2,以
x2 = 360.0 / 4095.0;
Run Code Online (Sandbox Code Playgroud)
要么
x2 = 360.0 / 4095;
Run Code Online (Sandbox Code Playgroud)
并且会得到与上面相同的结果.
正如@chris所提到的那样,使用a .也足够了.
关于精度,请回答上面的问题:
你已经在使用长双打..我不认为你在内部可以改变任何东西,除非你使用一些特殊的库,但你当然可以显示更多的数字.例如,
printf("%Lf, %.20Lf \n",x1, x2);
Run Code Online (Sandbox Code Playgroud)
会屈服
0.087912, 0.08791208791208791895
Run Code Online (Sandbox Code Playgroud)
最后,正如@ edA-qa mort-ora-y提醒我们的那样,你也可以将值转换为某些类型,但是当你这样做时它很重要.一个简单的例子(请注意,在任何情况下,值都会在赋值float 之后结束,因为v是a float):
float v = 0;
/* values shown are BEFORE assignment */
v = (5 / 2); /* value is 2 due to integer truncation before assignment */
v = (float) (5 / 2); /* 2.0 as integer division occurs 1st, then cast to float */
v = (float) 5 / 2; /* 2.5 since 5 becomes 5.0 through casting first. */
Run Code Online (Sandbox Code Playgroud)