C 为什么';我的程序不能处理浮点变量,但它可以处理int变量吗?
我试图编写一个方法,确定给定的数字是否为阿姆斯特朗数。可以通过以下步骤找到阿姆斯特朗号码:C 为什么';我的程序不能处理浮点变量,但它可以处理int变量吗?,c,math,C,Math,我试图编写一个方法,确定给定的数字是否为阿姆斯特朗数。可以通过以下步骤找到阿姆斯特朗号码: 取基本数字ie 456=>4,5,6 数字数ie 456的功率为3位,因此功率=3 通过pow为每个基地供电,即4^3、5^3、6^3 总计所有金额,即64+125+216=405 若总和等于原始数字,则为阿姆斯特朗ie 405!=456,所以阿姆斯特朗不是 int armstrong(float number){ if(number < 1){ return 0; } else{
int armstrong(float number){
if(number < 1){
return 0;
}
else{
float *pointer = malloc(sizeof (float)), *temp;
if(pointer == NULL){
printf("Error allocating memory: math::armstrong.\nReturn value 0.");
return 0;
}
else{
int temp_boolean = 1, index = 0;
float sum = 0, original_number = number;
while(temp_boolean == 1){
if(number / 10 == 0){
temp_boolean = 0;
}
else{
temp = realloc(pointer, ((sizeof pointer / sizeof (float)) + 1) * sizeof (float));
pointer = temp;
}
pointer[index] = fmod(number, 10.0);
//pointer[index] = number % 10;
number /= 10;
++index;
}
int i;
for(i = 0; i < index; ++i){
float temp_e = pointer[i];
sum += pow(temp_e, index);
}
free(pointer);
if(sum == original_number){
return 1;
}
else{
return 0;
}
}
}
int阿姆斯特朗(浮点数){
如果(数字<1){
返回0;
}
否则{
浮点*指针=malloc(sizeof(float)),*温度;
if(指针==NULL){
printf(“分配内存时出错:math::armstrong。\n返回值0”);
返回0;
}
否则{
int temp_boolean=1,index=0;
浮点数=0,原始数=数字;
while(temp_boolean==1){
如果(数字/10==0){
温度布尔值=0;
}
否则{
temp=realloc(指针,((指针大小/浮点大小))+1)*浮点大小);
指针=温度;
}
指针[索引]=fmod(数字,10.0);
//指针[索引]=编号%10;
数目/=10;
++指数;
}
int i;
对于(i=0;i
}我使用notepad++编写程序,使用gcc进行编译。类型为
float
的变量支持更大的值范围,但通过不表示某个范围内的所有可能值来实现这一点。例如,假设float
的大小为32位,而int
的大小为32位,则int
可以表示一些整数值,但float
不能表示
您的代码依赖于您所做的假设,float
可以表示每个整数值。在这种假设不正确的情况下——这至少会导致一些更大的积分值——您的函数将出现故障
如果您希望您的函数适用于较大的值,请尝试找到一种表示较大整数值的方法(即超出内置类型可以表示的范围)。执行此操作有许多选项,但一种方法是传递一个
char
数组,其中数组中的每个元素表示一个整数(例如,0
-9
)。这样做的代价是,您需要模拟在所选表示法上使用的所有操作(除法、模、求和、十次幂等)。float类型的变量支持更大的值范围,但通过不表示某个范围内的所有可能值来实现这一点。例如,假设float
的大小为32位,而int
的大小为32位,则int
可以表示一些整数值,但float
不能表示
您的代码依赖于您所做的假设,float
可以表示每个整数值。在这种假设不正确的情况下——这至少会导致一些更大的积分值——您的函数将出现故障
如果您希望您的函数适用于较大的值,请尝试找到一种表示较大整数值的方法(即超出内置类型可以表示的范围)。执行此操作有许多选项,但一种方法是传递一个
char
数组,其中数组中的每个元素表示一个整数(例如,0
-9
)。这样做的代价是,您需要模拟在所选表示法上使用的所有运算(除法、模运算、求和运算、十次方乘法等)。使用float
,因为“想存储更大的数字”是个坏主意float
只有~6位精度,因此一旦开始存储数以百万计的数据,就已经失去了这些数据的精度。double
类型是“默认”浮点大小,精度约为15位,但如果您想处理“非常大的整数”,它仍然不是解决方案
有很多bignum库,就在其中
其他库有时包含bignum支持,用于它们自己的目的,您也可以使用它们,例如。只要小心,抵制重新发明轮子的诱惑——bignum实现很容易找到,而且相当成熟
除此之外,我在代码中看到了
sum==original_number
——因为浮点数并不精确,所以检查它们是否相等也不是一个好主意。(GCC的-Wfloat equal
可以警告您这一点,我建议您将其添加到启用的警告列表中。)使用float
,因为您“想存储更大的数字”是个坏主意float
只有~6位精度,因此一旦开始存储数以百万计的数据,就已经失去了这些数据的精度。double
类型是“默认”浮点大小,精度约为15位,但如果您想处理“非常大的整数”,它仍然不是解决方案
有很多bignum库,就在其中
其他图书馆有时