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