浮动到MATLAB的fprintf()的文本行为

时间:2010-10-21 00:50:59

标签: matlab floating-point decimal

使用fprintf将浮点数转换为十进制表示形式的文本时,输出是一系列十进制数字(可能以0开头)。
这种表示如何运作?

>>fprintf('%tu\n',pi)
>>1078530011
>>fprintf('%bu\n',pi)
>>04614256656552045848

道歉,如果这是非常微不足道的;我在其他地方找不到答案,部分原因是搜索被各种可用的十进制数据类型所淹没。

请注意,%t和%b标志是与C fprintf()的两个不同之处。根据文档,它分别打印一个float或double“而不是无符号整数”。 o,x和u在八进制,十六进制和十进制之间切换。

2 个答案:

答案 0 :(得分:2)

此表示形式是数字的二进制IEEE 754 floating point representation,打印为无符号整数。

IEEE 754 Converter网站告诉我们,Pi的IEEE 754单精度表示(约3.1415927)是40490FDB十六进制,即十进制1078530011(您看到打印的数字)。 '%bu'格式说明符的工作方式类似,但输出双精度表示。

这些格式说明符的目的是允许您将浮点值的位精确表示存储到文本文件中。如果你想保证位精确存储,那么以人类可读形式打印浮点值的替代方法需要非常小心,并且可能存在一些边缘情况(非规范化值......?)能够精确存储。

答案 1 :(得分:1)

如果您要将数字打印为十六进制:

>> fprintf('%bx\n', pi)
    400921fb54442d18

>> fprintf('%tx\n', single(pi))
    40490fdb

然后格式化程序'%bx''%tx'等同于使用NUM2HEX:

>> num2hex( pi )
    400921fb54442d18

>> num2hex( single(pi) )
    40490fdb

另一种方法是使用以下命令将默认输出格式设置为十六进制:

>> format hex
>> pi
   400921fb54442d18
>> single(pi)
   40490fdb

在相关的说明中,@ Loren最近发表了一篇文章: “How Many Digits to Write?” 他们试图找到你需要写多少个十进制数字,以便在MATLAB中重新读取时保持数字的完整精度。