gpt4 book ai didi

c++ - 在没有库的情况下计算浮点值的小数位数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:29 24 4
gpt4 key购买 nike

我需要计算浮点值的小数位数,例如

1234.567 -> 3
2.1233 -> 4
4.2432 -> 4

我最初的想法是:

number = 1234.567;  
...
while (number - (int)number > 0.0)
{
// Count decimal places
...
number *= 10;
}

但是,这会导致 while 条件中的浮点精度出现问题。唯一安全的解决方法是将 float 转换为字符串,然后对小数位进行基于字符串的计数。

问题是:我不能使用任何库,无论是第三方库还是 C++ 标准库(由于环境限制)。我知道稍后如何对 char* 进行操作,但是如何在不使用 C++ 库的情况下将浮点值转换为字符串(即 char*)?

非常感谢任何帮助。


//编辑:这是我目前的方法,但仍然不起作用(例如 2.55555)。如何选择合适的阈值?

float abs(float number)  
{
return (number > 0.0 ? number : number * -1);
}

int round(float number)
{
return (int)(number + 0.5);
}

void splitFloat(float* number, int* mantissa, int* exponent)
{
while (abs(*number - round(*number)) > 0.00001)
{
// *number -= (int)*number; // ???
*number *= 10.0;

*mantissa = *number;
*exponent += 1;

cout << "Number: " << *number << ", Mantisse: " << *mantissa << ", Exponent: " << *exponent << endl;
}
}

最佳答案

您最初的想法非常接近,问题是 float 会进行舍入,从而使结果不准确。您需要使用阈值而不是精确地与 0.0 进行比较,并且您需要允许 (int) 操作可能会错误截断,您应该取而代之。您可以在截断前加 0.5 进行舍入。

当位数不再适合 int 时,您也会遇到问题。您可以通过在每一步中减去数字的整数部分来提供帮助。

编辑:要选择合适的阈值,请选择您要处理的最大小数位数。如果是 4,那么您要输出的最小数字是 0.0001。将阈值设为该值的一半,即 0.00005。现在,每次将数字乘以 10,阈值也乘以 10!

float threshold = 0.00005;
while (abs(*number - round(*number)) > threshold)
{
*number *= 10.0;
threshold *= 10.0;
// ...
}

如果你的 float 和 int 都是 32 位的,你应该不必担心减去 int。这会使返回尾数变得更加困难。

此外,我之前想给你一个警告但忘记了:这只适用于正数。

还有一个警告,float 的值范围非常有限。例如,您可能无法准确表示 1234.5670,最后会得到一个无关的数字。更改为 double 会解决这个问题。

关于c++ - 在没有库的情况下计算浮点值的小数位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843999/

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