gpt4 book ai didi

c - 如何修复用于分隔整数和小数部分的代码

转载 作者:行者123 更新时间:2023-11-30 19:01:04 24 4
gpt4 key购买 nike

我编写了一个函数,它接收 float ,将其更改为其小数部分并返回其整数部分。该函数的结构为 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;
}

最佳答案

考虑一下

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

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

但是,上述内容不会按预期工作。对于任何大于 ~1.6e7 的 x 值,单精度浮点精度的限制意味着最后一位的单位 (ULP) 大于 1.0f。具体来说,这意味着对于大于 1600 万左右的值,增量运算符不执行任何操作。结果是 while 循环永远不会退出。

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

关于c - 如何修复用于分隔整数和小数部分的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58469146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com