我是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();
}
答案 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这样做。