语言如何处理引擎盖下的印刷浮动?

Xan*_*ros 7 c algorithm floating-point decimal low-level

作为一个个人项目,我一直在为我自己的C语言编写一个编译器来定位我自己设计的CPU模拟器.

作为其中的一部分,我想实现一个标准浮点库(典型的IEEE单精度),但我一直在努力想出一种以易于阅读的方式打印浮点数的方法(如1.2345而不是原始数据整数),我能想到的最好的是生成log 10 2的值并进行一些奇数乘法以获得适合打印的数字.

是否存在将浮点数转换为易于打印的形式或打印浮点数的算法,该浮点数可以在不使用printf("%f",float_value);或类似C语言的类型转换的情况下实现?

Sim*_*rne 6

据我了解,目前用于打印浮点数的技术是Florian Loitsch的Grisu算法系列.你可以在这里阅读论文.

为了更简单地介绍将二进制浮点数转换为十进制(反之亦然)的问题,我完全推荐Rick Regan的网站,http://www.exploringbinary.com/


mcl*_*fix 3

这可能是一个函数的肮脏黑客,但您可以使用它作为函数正确显示浮点数的基础。除了 putchar 来实际打印某些内容之外,它不使用任何其他辅助函数,并且它不涵盖所有情况(例如您的数字是 NaN,甚至是负数!)但是,这只是一个起点:

#include <stdio.h>

void printfloat (float n)
{
    int whole = n;
    int power = 1;
    int digit;

    /* Find out the largest divisor for printing the integer part */
    while (whole>=1)
    {
        whole /= 10;
        power *= 10;
    }
    power /= 10;

    /* Prints the integer part of the number */
    whole = n;
    while (power>=1)
    {
        digit = whole/power;
        whole %= power;
        putchar ('0'+digit);
        power /= 10;
    }

    /* Prints the decimal point */
    putchar ('.');

    /* And now the fractional part */
    n = n-(int)n;
    while(n!=0)
    {
        digit = n*10;
        putchar ('0'+digit);
        n*=10;
        n = n-(int)n;
    }
    putchar ('\n');
}

int main()
{
    float n = 123.45678;

    printfloat(n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以在这里测试: http: //goo.gl/V4pgNZ

  • 不,这不能用作正确功能的基础。这只是一种肮脏的黑客行为,要从它转向正常工作的东西,我们需要扔掉它。在你的辩护中,要从头开始在 C 中实现适当的二进制到十进制,基本上需要从实现一个至少基本的 bignum 库开始(http://www.openwall.com/lists/musl/2012/04/10 /6 )但如果不想做正确的版本,至少可以做 http://www.opensource.apple.com/source/ruby/ruby-18/ruby/missing/strtod.c?txt 。当然,请阅读 http://www.exploringbinary.com/ 。 (4认同)