繁体   English   中英

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

[英]How do languages handle printing floats under the hood?

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

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

是否存在将浮点数转换为易于打印的形式或打印浮点数的算法,该浮点数可以在不使用printf("%f",float_value); 或者用C语言输入演员表?

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

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

它可能是函数的脏黑客,但您可以将其用作函数的基础,以正确显示浮点数。 它不使用任何其他辅助功能,除了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;
}

你可以在这里测试一下: http//goo.gl/V4pgNZ

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM