Floraction / Double的分数部分的数字

时间:2013-01-22 19:59:13

标签: c floating-point floating-accuracy ieee-754

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

我已经阅读了很多次,感觉非常舒服。第一步是假设值是字符串格式。我的实现是假设值是双重格式。

是否可以获得构成float / double的小数部分的位数?

例如,值3.24325(我希望无法用二进制表示,因为我只是随意选择它)。我想知道小数部分的长度是5位数,这样我就可以在上面的链接中继续算法了。

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

上述链接中的算法第1步有没有解决方案?

谢谢。

2 个答案:

答案 0 :(得分:0)

一种选择是将sprintfstrchr一起使用。以下是一个例子:

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;
    }