作为一个个人项目,我一直在为我自己的C语言编写一个编译器来定位我自己设计的CPU模拟器。
作为其中的一部分,我想实现一个标准浮点库(典型的IEEE单精度),但我一直在努力想办法以易于阅读的方式打印浮点数(如在1.2345而不是原始数据整数)中,我能想到的最好的是生成log 10 2的值并进行一些奇数乘法以获得适合打印的数字。
是否存在将浮点数转换为易于打印的形式或打印浮点数的算法,该浮点数可以在不使用printf("%f",float_value);
的情况下实现或以类似C语言输入类型?
答案 0 :(得分:6)
据我了解,目前用于打印浮点数的技术是Florian Loitsch的Grisu算法族。您可以阅读论文here。
为了更简单地介绍将二进制浮点数转换为十进制(反之亦然)的问题,我完全推荐Rick Regan的网站http://www.exploringbinary.com/
答案 1 :(得分:3)
它可能是函数的脏点,但您可以将其用作函数的基础,以正确显示浮点数。它没有使用任何其他辅助功能,除了putchar实际打印的东西,它并不涵盖所有情况(如你的数字是NaN,甚至是负面的!)但是,好吧,它&& #39;只是一个起点:
#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