出于这个问题的目的,我没有能力使用printf设施(不幸的是,我无法告诉你原因,但我们现在只是假设我知道我在做什么).
对于IEEE754单精度数,您有以下位:
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
Run Code Online (Sandbox Code Playgroud)
S符号在哪里,E是指数,F是分数.
对于所有情况,打印符号都相对容易,因为捕获所有特殊情况,如NaN(E == 0xff, F != 0),Inf(E == 0xff, F == 0)和0(E == 0, F == 0,因为在这种情况下不使用指数偏差,所以认为是特殊情况).
我有两个问题.
第一个是如何最好地将非规范化数字(where E == 0, F != 0)转换为规范化数字(where 1 <= E <= 0xfe)?我怀疑这对于简化下一个问题的答案是必要的(但我可能是错的,所以随时教育我).
第二个问题是如何打印标准化数字.我希望能够以两种方式打印它们,指数式-3.74195E3和非指数型3741.95.虽然,只要看看这两个并排,通过移动小数点就可以很容易地将前者转变为后者.所以我们只关注指数形式.
我对我很久以前用于打印PI的算法进行了模糊的回忆,其中你使用了一个不断减少的公式,并对可能性保持上限和下限,在两个限制达成一致时输出一个数字,并通过因子10(因此,当上限和下限为
3.2364和时3.1234,您可以输出3并在计算中进行调整).但是自从我这么做以后已经很长时间了,所以我甚至都不知道这是否适合采取这种做法.这么看来,因为每个比特的值是一半前一比特的通过小数部分移动时(
1/2, …
我有一个分配,我需要在不使用printf,putchar等的情况下在C中打印整数.不允许包含头文件.除了我写的任何东西,没有函数调用.我有一个函数my_char我正在使用(也许是错误的)但它打印出一个字符.我目前有以下代码向后打印数字.不寻找答案.只是寻找一些方向,一些帮助,也许我正在看它完全错误.
void my_int(int num)
{
unsigned int i;
unsigned int j;
char c;
if (num < 0)
{
my_char('-');
num = -num;
}
do
{
j = num % 10;
c = j + '0';
my_char(c);
num = num/10;
}while(num >0);
}
Run Code Online (Sandbox Code Playgroud)