C 将分数部分转换为二进制

C 将分数部分转换为二进制,c,floating-point,C,Floating Point,我有一个浮点数的小数部分(例如-10.5中的5)。这是一个字符,因为我从输入中提取了它。如何将该字符转换为该浮点数的二进制小数部分?(我正在32位IEEE784中构建浮点输入->十六进制输出,我已经提取了尾数的符号、指数和整数部分的二进制表示。) 我一直在考虑实现一种算法,将分数乘以2并取余数,然后重复,直到它填满尾数,但我不允许在赋值中使用任何浮点运算 示例: 用户输入-10.5。程序需要取数字的分数(5)并将其转换为二进制格式(1(.1)) 编辑:我受16位寄存器大小的限制,因此我需要一个解

我有一个浮点数的小数部分(例如-10.5中的5)。这是一个字符,因为我从输入中提取了它。如何将该字符转换为该浮点数的二进制小数部分?(我正在32位IEEE784中构建浮点输入->十六进制输出,我已经提取了尾数的符号、指数和整数部分的二进制表示。)

我一直在考虑实现一种算法,将分数乘以2并取余数,然后重复,直到它填满尾数,但我不允许在赋值中使用任何浮点运算

示例: 用户输入-10.5。程序需要取数字的分数(5)并将其转换为二进制格式(1(.1))


编辑:我受16位寄存器大小的限制,因此我需要一个解决方案来处理大于2^16-1的数字。

您的想法基本正确。只要将小数部分加倍,进位就变成了数字。让我们以将
.7
转换为二进制为例(
.5
太简单了)

所以二进制中的
.7
.101100110…
<代码>10.7只会是
1010.101100110…

一旦余数变为
0
,或者由于IEEE浮点精度的限制,总表示长度变为24位,则可以停止转换为二进制

请注意,十进制本身纯粹是装饰性的,这里不使用浮点

NUMBER     %10    /10
     7     ---      .
    14       4      1
     8       8      0
    16       6      1
    12       2      1
     4       4      0
     8       8      0
    16       6      1
    12       2      1
&ct.

如果是
.07
,则表示余数,并分别按
%100
/100
进行进位。在
.007
的情况下,您将使用IEEE-754意义上的
%1000
/1000
,在整数的上下文之外,浮点数的小数部分没有明确的含义。将值
10.5
与值
10.0
区分开来的位比将值
0.0
与值
0.5
区分开来的位在总体表示中所占比例更小。当我们谈论IEEE-754数字表示法的“分数”部分时,我们通常谈论尾数的所有位;对于IEEE 754单精度二进制格式,它是24位,包括一个隐含位,而不考虑数字的大小

更新/修订:

基于澄清该问题的更新,我已经替换了我之前的大部分答案,该答案解决了以编程方式提取
浮点
双精度
的位的问题,而不是将十进制格式的文本表示转换为IEEE-754格式表示的位。解析文本是一个棘手的问题,正如我在这个答案的原始版本中所说的

不过,我重申,我认为把尾数分开是错误的。我看不出它有什么特别的优点,但它引入了以后正确重组片段的问题

以下是解决整个问题的可行方法:

  • 根据是否有负号确定输入号码的符号

  • 形成输入数字绝对值的bignum表示形式。例如,一个base-100000000表示,存储在
    uint32\u t
    数组中。只要基数是10的幂,就可以直接将十进制格式的输入数字解析为这种表示形式,这样做不会引入舍入错误

  • 按适当的二次幂缩放bignum表示,以获得223到224-1之间的缩放值。这只能通过整数运算完成。请注意,您可能需要按比例缩小,而不是按比例增大。无论哪种方式,这种缩放都可以通过整数运算单独执行。请记住,比例因子使用了两次幂(
    s
    )中的哪一次幂(即比例因子的基数2对数,与其说是比例因子本身,不如说是比例因子本身;这可以很容易地从算法中得出,而无需计算超越函数)

  • 四舍五入到单位精度

  • 然后将步骤1中的符号位、尾数/有效位的位作为bignum的剩余有效位(记住,在最终IEEE格式中,最有效的位是隐式的,而不是显式的),指数为
    23-s


    还要注意的是,这种方法可以很自然地推广到科学记数法。

    这个问题不是很清楚。请说明一些典型输入,它们是如何获得的,以及每种情况下所需的输出。代码(“我提取了…”)目前,我有两个32位的内存字,长型数字,一个是1(因为符号是负数),另一个是二进制的10。我还有字符数组,字符“5”是第一个也是唯一一个元素。它是提供的数字的分数(可以是“05”、“00001257852”等)。我只需要把它转换成比特。。。。在这个问题上,请不要像华夫饼干那样。非常感谢!我将立即尝试实施解决方案,太棒了!谢谢,可悲的是,一些大学教授缺乏常识。我的想法是由我大学的一个家伙提出的,他已经完成了这个任务,分别翻译整数和小数部分(这就是我要做的)。我将把它们放入32位内存字(符号字、指数字、尾数字)中,根据需要进行移位并添加到寄存器中。然后我会以某种方式打印出所有内容。好吧,请注意,32位可能不够。您可能需要少至零,或多至53(同样,IEEE二进制双精度)来表示数字量值中大于单位精度的部分。对于不能准确表示的数字,也要注意正确地将结果四舍五入。我理解,但我不理解
    NUMBER     %10    /10
         7     ---      .
        14       4      1
         8       8      0
        16       6      1
        12       2      1
         4       4      0
         8       8      0
        16       6      1
        12       2      1
    &ct.