为什么编译器认为我在使用double,in";战俘';双倍';至';浮动';C4244

为什么编译器认为我在使用double,in";战俘';双倍';至';浮动';C4244,c,double,C,Double,我是C编程新手。我不断得到这个错误(在这个例子中,与立方根函数中的代码有关): 1> c:\users\r\documents\visual studio 2010\projects\lab5.c\lab5.c\lab5code.c(57):警告C4244:“=”:从“double”转换为“float”,可能会丢失数据 我曾尝试将立方根计算存储在浮点中,然后将其返回到main,但仍然没有成功。我看到人们编译我的代码时没有问题。 到目前为止,我已经在VS2008和2010快速版上测试了这些代码,同

我是C编程新手。我不断得到这个错误(在这个例子中,与立方根函数中的代码有关):

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

我曾尝试将立方根计算存储在浮点中,然后将其返回到main,但仍然没有成功。我看到人们编译我的代码时没有问题。 到目前为止,我已经在VS2008和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();
}    
//包含头文件
#包括//定义printf、scanf和getch
#include//Defines get.ch
#包含//定义系统(“暂停”)
#include//定义数学函数
//功能原型
无效解释();
浮点获取_值();
浮点立方_根(浮点数);
无效显示(浮动x、浮动y);
内部主(空)
{
飘进来,飘出去;
//变量声明
explain();//explain
in=get_value();//从用户处获取值
out=立方_根(in);//计算
显示(输入,输出);//输出
}
//函数定义
无效解释(无效)
{
系统(“cls”);
puts(“这将取立方根\n按enter键继续…”);
_getch();
}
浮点获取_值(void)
{
浮点输入;
fflush(stdin);
puts(“输入要作为多维数据集根的数字…\n”);
扫描单位(“%f”,输入(&I);
返回(输入);
}
浮点立方根(浮点数)
{
浮点数,总计;
总数=(功率(数值,1.0/3.0));
收益(总计);
}
无效显示(浮动x、浮动y)
{
printf(“%.1f,%.1f”,x,y);
getch();
}    
因为
pow()
返回一个
double
,并且您正在将它分配给一个
浮点值

exp1=pow(num,0.33);
因为
pow()

exp1=pow(num,0.33);
这:

将类型为
double
的返回值指定给类型为
float
exp

exp1=pow(num,0.33);
修复方法是使用
powf()
函数:

float cubic_root(float num)
{
    return powf(num, 1.f / 3.f);
}
当然,您可以将结果强制转换为float,告诉编译器您的意思是这样的,但是使用比实际需要的精度更高的求幂计算似乎是非常浪费和毫无意义的,所以不要这样做。

这:

将类型为
double
的返回值指定给类型为
float
exp

exp1=pow(num,0.33);
修复方法是使用
powf()
函数:

float cubic_root(float num)
{
    return powf(num, 1.f / 3.f);
}
当然,您可以将结果强制转换为float,告诉编译器您的意思是这样的,但是使用比您实际需要的精度更高的求幂计算似乎是非常浪费和毫无意义的,所以不要这样做。

pow()
返回一个
双精度
,您将其转换为
浮点
。这就是发出警告的原因,您应该注意它

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

注意
pow(num,0.33)
是一个奇怪的立方根近似值。使用
pow(num,1.0/3)取而代之。您需要使用
1.0
,以便以浮点计算文本(最有可能在编译时进行计算)。

pow()
返回一个
双精度
,并将其转换为
浮点
。这就是发出警告的原因,您应该注意它

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


注意
pow(num,0.33)
是一个奇怪的立方根近似值。使用
pow(num,1.0/3)取而代之。您需要使用
1.0
,以便以浮点计算文本(最有可能在编译时计算)。

好的,那么如何将double转换为float呢。或者,如果我现在尝试使用浮点,我是否不使用pow?@Typical使用不同的类型、不同的函数:powf(),或强制转换结果。@Typical为什么要使用
float
?它们不会给你很多有效数字。一个2美元的计算器会比一个C浮点更好!详情请参见。@PM2Ring您为什么认为需要高精度?@2501:我不这么认为;我只是指出,浮点运算的精度相当有限。但我很想知道为什么在今天这个时代,Typical如此热衷于使用它们。好吧,那么我如何将double转换成float呢。或者,如果我现在尝试使用浮点,我是否不使用pow?@Typical使用不同的类型、不同的函数:powf(),或强制转换结果。@Typical为什么要使用
float
?它们不会给你很多有效数字。一个2美元的计算器会比一个C浮点更好!详情请参见。@PM2Ring您为什么认为需要高精度?@2501:我不这么认为;我只是指出,浮点运算的精度相当有限。但我很想知道为什么在今天这个时代,Typical如此热衷于使用它们。这确实是最好的答案,但返回值是不正确的。通过将答案乘以3倍来测试立方根,看看你与输入的偏差有多大。@Bathsheba,我使用的是1.0/3.0,我知道.33是不正确的。@Bathsheba说得好,我提高了1/3常数的精度,我认为这有帮助。例如,
cubic\u root(8)
我在ideone上得到了
2.000000
。格式设置为小数点后6位,对于
1337.04
的输入,我得到了输出
11.016614
。这就是e