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{

我试图编写一个方法,确定给定的数字是否为阿姆斯特朗数。可以通过以下步骤找到阿姆斯特朗号码:

  • 取基本数字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{
        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
    }

  • 如果给定的数字是阿姆斯特朗数,我的程序返回1;如果不是阿姆斯特朗数,则返回0。现在,当我将变量和参数作为int时,这可以很好地工作,但我希望能够接收更大的数字,这就是为什么我的代码将变量设置为float。但出于某种原因,它没有提供任何输出。它可以用gcc和-Wall选项编译,所以我不知道我做错了什么


    我使用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库,就在其中

    其他图书馆有时