为什么编译器认为我在" pow"中使用了double。 '双'到'漂浮' C4244

时间:2014-10-08 07:42:45

标签: c double

我是C编程新手。我一直收到这个错误,(在这种情况下与立方根函数内的代码有关):

  

1> c:\ users \ r \ documents \ visual studio 2010 \ projects \ lab5.c \ lab5.c \ lab5code.c(57):警告C4244:' =' :转换为' double' “浮动”,可能导致数据丢失

我已经尝试将立方根计算存储在float中,然后将其返回到main,但仍然没有运气。我见过人们编译我的代码没有问题。 到目前为止,我已经测试了VS 2008和2010快速版的代码,同样的错误。我得到了很多,试图找出原因。

   //INCLUDE HEADER FILES
#include <stdio.h> //Defines printf, scanf & getch
#include <conio.h> //Defines get.ch
#include <stdlib.h> //Defines system("pause")
#include <math.h> //Defines math functions


// FUNCTION PROTOTYPES
void explain();
float get_value();
float cubic_root(float num);
void display(float x, float y); 

int main(void) 
{
    float in,out;
    //Variable Declarations 
    explain();          //Explain
    in=get_value();     //Get Value from USER
    out=cubic_root(in); //Calculations
    display(in,out);    //Output
}

//FUNCTION DEFINITIONS 
void explain(void)
{
    system("cls");
    puts("This will take cubic root\nPress enter to continue...");
    _getch();

}

float get_value(void)
{
    float input;
    fflush(stdin);
    puts("Enter the number you want to cube root...\n");
    scanf_s("%f",&input);
    return(input);
}

float cubic_root(float num)
{
    float div,total;
    total=(pow(num,1.0/3.0));
    return(total);

}

void display(float x, float y)
{
    printf("%.1f, %.1f",x,y);
    getch();
}    

3 个答案:

答案 0 :(得分:3)

由于pow()会返回double,并且您将其分配给float

exp1=pow(num,0.33);

答案 1 :(得分:3)

pow()返回double,您将其转换为float。这就是发出警告的原因,你应该注意它。

最好的办法是重构代码以使用double精度变量。您可能会发现这样做没有性能损失,因为许多低级浮点计算无论如何都处于(或高于)双精度。

请注意,pow(num, 0.33);是多维数据集根的怪诞近似。请改用pow(num, 1.0 / 3);。您需要使用1.0,以便以浮点计算文字(很可能在编译时)。

答案 2 :(得分:2)

此:

exp1 = pow(num, 0.33);

the pow() function的返回值double分配给类型为exp的{​​{1}}。

修复方法是改为使用float函数:

powf()

你当然可以将结果转换为float cubic_root(float num) { return powf(num, 1.f / 3.f); } 告诉编译器你真的是这个意思,但是使用比你真正需要的更精确的指数计算似乎是非常浪费和毫无意义的,所以不要&#39这样做。