如何修复将整数与小数部分分离的代码

时间:2019-10-20 00:37:33

标签: c floating-point

我编写了一个函数,该函数接收一个浮点数,将其更改为小数部分,然后返回其整数部分。功能被构造为if-else语句(以区分正数和负数)。但是,仅该语句的第一部分起作用。在以下情况下,仅当我键入负数或零数字时,代码才起作用;当我输入一个正数时,它只会显示零。问题不在于将整数与小数部分分开的算法,因为我也构造了else-if,如果第一部分为x正数,而且只有第一部分有效。

#include <stdio.h>
#include <stdlib.h>

//creates a function that changes the value of x to its
//fractional part and returns its integer part
float integerpart(float *x)
{
    float integer = 0;
    //If x is negative
    if (*x<0)
    {
        //I use an algorithm to separate its integer from its fractional part
        while (*x+1 <= integer)
        {
            integer--;
        }
        //I define the new value of x as its fractional part
        *x = *x - (integer);
    }
    else if (*x=0)
    {
        *x = 0;
        integer = 0;
    }
    //In the case in which x is positive
    else
    {
        //I do the inverse algorithm
        while (integer <= *x-1)
        {
            integer++;
        }
        *x-=integer;
    }
    //I return the integer part
    return integer;
}


int main()
{
    //Ask for the user to type a real number
    float number;
    printf("Type a real number:\n");
    scanf("%f", &number);
    //Uses the function to take the integer part of x
    float integ;
    integ = integerpart(&number);
    //Prints the integer and fractional part
    printf("Integer part = %f   Fractional Part = %f\n", integ, number);
    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

考虑这个

while (integer <= *x-1)
{
    integer++;
}
*x-=integer;

对于较大的x,这将非常缓慢。最坏的情况(如果上述操作符合预期),最大值约为〜1e38。假设您的计算机每秒可以执行十亿次循环迭代。这将使〜1e29秒运行时间。

但是,以上操作无法按预期进行。对于任何{〜1e}大于〜1.6e7的值,单精度浮点精度的限制意味着最后一个单位(ULP)大于1.0f。具体来说,这意味着对于大于1600万的值,增量运算符将不执行任何操作。结果是x循环将永远不会退出。

如评论中所述,请考虑使用标准函数。否则,我建议您将符号尾数和while值的指数分开。