我正在尝试实施http://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/
我已经阅读了很多次,感觉非常舒服。第一步是假设值是字符串格式。我的实现是假设值是双重格式。
是否可以获得构成float / double的小数部分的位数?
例如,值3.24325(我希望无法用二进制表示,因为我只是随意选择它)。我想知道小数部分的长度是5位数,这样我就可以在上面的链接中继续算法了。
使用类似modf
的内容会导致乍一看似乎是正确的小数值,但实际上是舍入的(假设小数部分不能用二进制精确表示)。从原始值中减去原始值的类型转换int会产生相同的舍入小数。使用sprintf在字符串中记录值会产生类似的问题(我相信),但我没有足够的时间来确认 - 我刚刚开始玩它。
上述链接中的算法第1步有没有解决方案?
谢谢。
答案 0 :(得分:0)
一种选择是将sprintf
与strchr
一起使用。以下是一个例子:
int main() {
double d = 3.24325;
char str[20];
sprintf(str, "%.10f", d);
puts(str);
int digits = strchr(str, '0') - strchr(str, '.') - 1;
printf("%d", digits);
}
输出
3.2432500000
5
在上面的代码中,strchr
搜索.
和(第一个尾随)0
的位置,并根据它计算数字。为了简化演示,我在0
附加了一些额外的%.10f
s。您可以通过比较0
是否返回指向字符串结尾的指针来调整没有尾随strchr
的情况的计算。
答案 1 :(得分:0)
以下是一种天真的问题解决方法。在大多数情况下,这可以工作但是浮点整数表示可能导致错误。
#include <stdio.h>
#include <math.h>
#define eps 0.000001
int main(){
double inp=3.12456789;
int fdigits=0;
while(fabs(round(inp)-inp)>eps){
printf("dif %f\n",fabs(round(inp)-inp));
inp=inp*10;
fdigits++;
}
printf("%d",fdigits);
return 0;
}