Devil12138 发表于 2014-8-30 18:23:21

为什么将float改成double结果会出错



#include <stdio.h>


void main()
{
        double power(float x,float y);
        float a,b,c;             /*为什么将float改成double结果会出错*/

        scanf("%f,%f",&a,&b);
        c=power(a,b);
        printf("result is %f\n",c);
}


double power(float x,float y)
{
        float z=1;
        int i;

       
        for(i=0;i<y;i++)
        {
                z*=x;               
        }
        return z;
}

牡丹花下死做鬼 发表于 2014-8-30 18:51:35

你f改lf没??

低调哥 发表于 2014-8-30 21:59:45

主函数中的power(flout x,flout y)形参中的x和y不能使用,需要使用其它自定义的字母,避免和下面函数中的形参混淆,你可以试一下。

Devil12138 发表于 2014-8-31 08:01:35

谢谢

ゃ莼处狼性ぉ 发表于 2014-8-31 11:13:59

绝对支持……

zhumengyun 发表于 2014-8-31 19:51:48

ゃ莼处狼性ぉ 发表于 2014-8-31 11:13
绝对支持……

你定义的变量c是float型,函数的返回值是double 型,需要强制类型转换,c=(float)pow(a,b)

kingze1992 发表于 2014-9-4 23:36:22

a由float类型改为double类型后,其所占字节数由4字节(float类型)变为8字节(double类型),在用scanf()函数进行输入时,如果用%f控制输入,则只能输入4个字节的内容,另外4个字节的内容是随机的,这两个4字节一起构成double类型的8个字节,所以输入本身就不正确, double类型只能用 %lf控制输入
这个你可以逐过程调试一下,发现你输入的数据本身不正确,与你所调用的函数无关
再补充一下:
在你必须知道的495个C语言问题   一书中:

12.7    有人告诉我在printf中使用%lf 不正确。那么,如果scanf() 需要
      %lf, 怎么可以用在printf() 中用%f 输出双精度数呢?

    printf的%f 标识符的确既可以输出浮点数又可以输出双精度数。根据 “缺
省参数扩展” 规则,不论范围内有没有原形都会在在类似printf的可变长度参
数列表中采用,浮点型的变量或扩展为双精度型,因此printf() 只会看到双精度
数。printf() 的确接受%Lf, 用于输出长双精度数。
页: [1]
查看完整版本: 为什么将float改成double结果会出错