Xan*_*ros 7 c algorithm floating-point decimal low-level
作为一个个人项目,我一直在为我自己的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;
}
Run Code Online (Sandbox Code Playgroud)
您可以在这里测试: http: //goo.gl/V4pgNZ