为了账号安全,请及时绑定邮箱和手机立即绑定

POW函数的奇怪行为

POW函数的奇怪行为

C
aluckdog 2019-07-13 15:58:41
运行以下代码行时:int i,a;    for(i=0;i<=4;i++)  {         a=pow(10,i);         printf("%d\t",a);    }我很惊讶地看到了输出,结果是1 10 99 1000 9999而不是1 10 100 1000 10000.可能的原因是什么?注如果您认为这是浮点不准确,那么在上面的for循环中i = 2,存储在变量中的值。a是99.但如果你改写a=pow(10,2);现在,a的价值出来了100..那件事怎么可能?
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

我甚至不会拼写c,但我可以告诉你原因。

你已经a做一个intpow()生成一个浮点数,在某些情况下可能只是一个小于100或10000的头发(正如我们在这里看到的)。

然后将其填充到整数中,该整数截断为整数。所以你失去了小数部分。哎呀。如果您确实需要一个整数结果,则圆形可能是执行该操作的更好方法。

即使是在那里,也要小心,因为足够大的力量,这个错误可能真的很大,仍然会导致失败,给你一些你不期望的东西。请记住,浮点数只具有如此高的精度。


查看完整回答
反对 回复 2019-07-13
?
守着一只汪

TA贡献1872条经验 获得超3个赞

功能pow()返回double..你把它分配给变量a,类型int..这样做并不能“舍入”浮点值,它会截断浮点值。所以pow()会退回大约99.99999.为了10^2,然后你就扔掉了.9999.部分。更好地说a = round(pow(10, i)).


查看完整回答
反对 回复 2019-07-13
?
慕森卡

TA贡献1806条经验 获得超8个赞

从数学上讲,整数的整数幂是整数。

质量好pow()例程这个特定的计算不应产生任何舍入错误.我在Eclipse/MicrosoftC上运行了您的代码,并获得了以下输出:

1   10  100 1000    10000

此测试并不表示Microsoft是否在使用浮点数和舍入,或者它们是否检测到数字的类型并选择适当的方法。

因此,我运行了以下代码:

#include <stdio.h>#include <math.h>main (){
    double i,a;

    for(i=0.0; i <= 4.0 ;i++)
    {
        a=pow(10,i);
        printf("%lf\t",a);
    }}

得到了以下输出:

1.000000    10.000000   100.000000  1000.000000 10000.000000


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 528 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信