TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?相关的知识,希望对你有一定的参考价值。

0x3f800000在单精度浮动数学中表示1.0。我尝试了此操作,但无法从程序中获得正确的结果:

set x 0x3f800000
set y [expr double($x)]
puts $y

我只想将x的值“强制转换”为浮点数,以便将其作为浮点数显示在屏幕上。如何在tcl中执行此操作?

[请注意,在我要解决的原始问题中,tcl脚本从Quartus II System Console调试系统中的硬件寄存器中读取值。但是,我给出了一个简单的示例代码,以使其他人容易理解我需要做什么。

答案

没有任何内置功能。但是https://en.wikipedia.org/wiki/Single-precision_floating-point_format的某个时间导致我:

proc binary32_to_double value 
    set sign [expr ($value & 0b10000000000000000000000000000000) >> 31]
    set exp  [expr ($value & 0b01111111100000000000000000000000) >> 23]
    set frac [expr ($value & 0b00000000011111111111111111111111) >>  0]

    set frac_bits [format %023b $frac]
    set fraction 1.0

    for set i 1 $i <= 23 incr i 
        set bit [string range $frac_bits $i-1 $i-1]
        set fraction [expr $fraction + $bit * 2**double(-$i)]
    

    expr (-1)**$sign * 2**double($exp - 127) * $fraction

并演示:

% binary32_to_double 0x3f800000
1.0
% binary32_to_double 0b00111110001000000000000000000000
0.15625
% binary32_to_double 0b10111110001000000000000000000000
-0.15625

以上是关于TCL:变量存储一个代表浮点数的十六进制值,如何将它作为浮点数显示在屏幕上?的主要内容,如果未能解决你的问题,请参考以下文章

浮点数的十六进制表示

C51浮点数显示浮点数表示方法

Python如何将浮点数作为十六进制转换为十进制

浮点类型是如何存储的

[算法]浮点数在内存中的存储方式

从代表二进制的字符串转换为浮点数