#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <crtdbg.h>
int main(void)
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
int request = 0;
printf("How many powers of two? ");
scanf("%d", &request);
float* p_array = 0;
p_array = malloc(sizeof(float)*request);
for (int k = 0; k < request; ++k)
{
p_array[k] = (powf(2, k));
}
for (int k = 0; k < request; ++k)
{
printf("%f\n", p_array[k]);
}
free(p_array);
p_array = 0;
return 0;
}
这是我坚持了一段时间的练习,不确定如何处理,我在第20行中不断收到此错误-source.c(20):
警告C4244:“功能”:从“ int”转换为“ float”,可能会丢失数据。
这是p_array[k] = (powf(2, k));
。
我不知道如何解决这个问题。
任何帮助将不胜感激。
答案 0 :(得分:2)
发出警告是因为(理论上,至少)int
数据类型可以容纳更多的有效位数字(对于32位整数,通常为10位)。由float
数据类型表示(通常仅在7或8左右)。
代码中的隐式转换位于powf
的第二个参数中:您的 integer k
索引将根据需要转换为float
您只需在k
参数中添加 explicit 强制转换即可使警告静音(将 first 参数明确标记为float
常量):
p_array[k] = (powf(2.0f, (float)(k)));
答案 1 :(得分:0)
请注意,powf()
在传递2和k时都期望有两个浮点值,它们都是整数。试用powf(2.f, (float)k)
。