计算不带库的浮点值的小数位数
Calculate number of decimal places for a float value WITHOUT libraries?
我需要计算浮点值的小数位数,例如
1234.567->3
2.1233->4
4.2432->4
我最初的想法是:
number = 1234.567;
...
while (number - (int)number > 0.0)
{
// Count decimal places
...
number *= 10;
}
但是,这会导致while条件下的浮点精度出现问题。唯一安全的解决方法是从浮点转换为字符串,然后进行基于字符串的小数位数计数。
问题是:我不能使用任何库,既不能使用第三方库,也不能使用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;
}
}
您最初的想法非常接近,问题是浮点进行舍入,从而使结果不准确。您需要使用阈值,而不是与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
可以解决此问题。
你最初的想法很好,但你需要假设一个最小的错误:
number = 1234.567;
...
while (fabs(number - round(number) > 0.00001)
{
// Count decimal places
...
number *= 10;
}
请注意,当你说1234.567
时,计算机可能会说1234.5670000001
或1234.566999999
,而你不想计算0或9的所有部分。
小心回旋,而不是截断!
但请注意,对于负数,它可能不会像预期的那样起作用。
我认为您最好计算std::numeric_limits<float>::digits10 - log10(value)
,因为这是该值的最大小数位数。如果你有东西要格式化数字,你可以格式化到这个精度,去掉后面的零。如果没有格式化值的东西,你可能需要做很多事情:如果你想要好的结果,这种方法显然是不平凡的。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 如何计算文件中的"columns"数?
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 我如何限制计算出的浮点值的小数位数
- 计算 Pi 的值高达 'n' 位小数
- 如何计算C++浮点数中的小数位数
- 如何在C++中计算10位小数精度的双变量
- 计算不带库的浮点值的小数位数
- 如何使用模运算符计算小数
- 只使用前3位小数计算,如何??(c++)
- 公式中没有把小数计算在内
- 如何计算具有 n 位小数的浮点数