搜索后我发现的所有内容都是如何使用它们。我真的很好奇为什么。使用十六进制格式的浮点值有什么好处?
进行澄清说明:
我正在研究以获得Zend PHP工程师证书。在其中一项实践测试中,它发布了带有一些变量集的代码块,进行了一些基础数学运算,然后询问输出是什么。设置的变量之一是“ 0xFF”。据我了解,它将255.0表示为浮点值。
所以,我的问题是这是什么时候
0xfed01
比这更好的用途
1043713
C具有十六进制浮点常数,格式以“ 0x”开头,然后是十六进制数字(可选地包括小数点),然后是“ p”,然后是十进制的带符号的指数,即2的幂。例如,0x1.fp-2是(1 + 15/16)•2 [-2] = .484375。 (这些常量是不带后缀的double
,带float
或f
后缀的F
和带long double
或l
后缀的L
。)]十六进制浮点常量使编译器易于重现精确值。
使用十进制常数,将十进制数转换为二进制浮点数会有些困难。这是因为某些值可能非常接近某个值,该值取决于尾随数字而向上或向下取整。由于数字运算容易舍入误差,因此很难进行算术运算。在计算涉及超出浮点格式通常表示的数字的精确值时,要避免舍入错误,需要进行仔细的工程设计。
这是一个已解决的问题(Correctly Rounded Binary-Decimal and Decimal-Binary Conversions by David M. Gay, 1990)。但是,某些编译器没有正确实现它。程序员很容易编写代码来转换十六进制浮点数,因为它很好地适合二进制格式:您可以通过检查一些单独的数字来轻松判断数字是在舍入点之上还是之下。不需要涉及四舍五入误差的算术。
通常,关注浮点精度的软件工程师会通过使用特殊软件(例如Maple或Mathematica或他们自己的自定义任务特定软件或组合)生成十六进制浮点常量,以供在程序中使用。 )。
也可以通过指定其内部表示形式来创建浮点常量,例如通过创建无符号整数和浮点对象的并集并用该整数的十六进制值初始化该集来创建一个浮点常量。这需要了解浮点值的编码格式。很少应该这样做。通常,它仅对特殊用途有用,例如使用有效负载准备NaNs并在执行专门浮点运算的软件中工作。