2

我正在尝试实施http://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/

我已经通读了好几遍,感觉很舒服。第一步是假设值是字符串格式。我的实现是假设该值是双格式的。

是否可以获得构成浮点数/双精度数的小数部分的位数?

例如值 3.24325(我希望不能用二进制精确表示,因为我只是随机选择的)。我想知道小数部分的长度为 5 位,以便我可以继续使用上面链接中的算法。

使用类似的modf结果乍一看似乎是正确的小数值,但实际上是四舍五入的(假设小数部分不能以二进制精确表示)。从原始值中减去原始值的类型转换 int 会导致相同的四舍五入的小数。用 sprintf 将值记录在字符串中会导致类似的问题(我相信),但我没有足够的时间来确认 - 我刚刚开始使用它。

上面链接中算法的第1步有什么解决方案吗?

谢谢你。

4

2 回答 2

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;
    }
于 2013-01-22T20:52:17.133 回答
0

一种选择是使用sprintfwith 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搜索.and (first trailing)的位置,0并根据它计算位数。为简单起见,我0%.10f. 0您可以通过比较strchr返回指针是否指向字符串末尾来调整没有尾随的情况的计算。

于 2013-01-22T20:19:07.263 回答