微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 划分和浮点

任何人都可以帮助我为什么x2打印零.
我想因为浮点表示X1四舍五入,有没有办法保持进动.
long double x1,x2;
x1= 0.087912088; // Note: 360/4095 = 0.087912088
x2 = 360/4095;
printf("%Lf,%Lf \n",x1,x2);

结果:

x1 =0.087912
x2= 0.000000

解决方法

问题是整数截断..你要划分两个整数=>结果将是另一个整数,其中小数部分被丢弃. (例如,在整数除法的实际结果为3.9的情况下,截断将使其为3(即,它不会舍入)).

在您的情况下,如果您将其更改为:

x2 = 360 / 4095.0;  /* one of the operands Now has a decimal point */

你会得到

0.087912,0.087912

作为输出.

即,只要除法运算符的一个或两个操作数都是浮点数/双精度数,结果也是如此(即,它将被“提升”为浮点数/双精度数).所以我可以将x2更改为

x2 = 360.0 / 4095.0;

要么

x2 = 360.0 / 4095;

并且会得到与上面相同的结果.

正如@chris刚刚提到的那样.也足够了.

关于精度,请回答上面的问题:

你已经在使用长双打..我不认为你在内部可以改变任何东西,除非你使用一些特殊的库,但你当然可以显示更多的数字.例如.,

printf("%Lf,%.20Lf \n",x2);

会屈服

0.087912,0.08791208791208791895

最后,正如@ edA-qa mort-ora-y提醒我们的那样,你也可以将值转换为某些类型,但是当你这样做时它很重要.一个简单的例子(请注意,在任何情况下,值在赋值后最终都为float,因为v是一个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. */

原文地址:https://www.jb51.cc/c/116703.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐