我编写了一个函数,该函数接收一个浮点数,将其更改为小数部分,然后返回其整数部分。功能被构造为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;
}
答案 0 :(得分:1)
考虑这个
while (integer <= *x-1)
{
integer++;
}
*x-=integer;
对于较大的x
,这将非常缓慢。最坏的情况(如果上述操作符合预期),最大值约为〜1e38。假设您的计算机每秒可以执行十亿次循环迭代。这将使〜1e29秒运行时间。
但是,以上操作无法按预期进行。对于任何{〜1e}大于〜1.6e7的值,单精度浮点精度的限制意味着最后一个单位(ULP)大于1.0f。具体来说,这意味着对于大于1600万的值,增量运算符将不执行任何操作。结果是x
循环将永远不会退出。
如评论中所述,请考虑使用标准函数。否则,我建议您将符号尾数和while
值的指数分开。