【发布时间】:2021-10-21 09:29:58
【问题描述】:
示例代码:
void print_f( float f )
{
...
}
int main( void )
{
print_f( 1.0f ); // prints 1.0
print_f( 29.0f ); // prints 29.0
print_f( 29.13f ); // prints 0x1.d2147ap+4
print_f( 256.0f ); // prints 256.0
print_f( 256.1f ); // prints 0x1.00199ap+8
// and so on
return 0;
}
即如果使用%f无法精确打印浮动常量,则使用%a。
问题:“使用%f无法精确打印浮点常量”的条件是什么?
【问题讨论】:
-
我想说你永远不想在
%f和%a之间动态切换。如果您想要人类可读,请使用%f。如果您希望机器可读且具有完美的可重复性,请使用%a。哪个消费者不会介意这两者之间的这种不相容的来回? -
无法完成。代码中的常量在编译时转换为可表示的值。
-
但是,对于任何给定的浮点类型(例如
float或double),我相信您可以设计一个printf精度,这样即使不精确,打印的值也会导致如果接收方使用atof或strtod或scanf("%f")将其读回,则在另一端读取相同的值。%a的优点是它更容易实现结束端到端无损传输,无需打印可能不必要的额外数字——但我相信您也可以使用%e或%g实现端到端无损传输。 (不过,可能不是%f,或者至少不会浪费大量空间。) -
更新问题以明确说明选择的标准。例如: (a) 如果 x 是
float f中的值,并且%f产生的数字正好是 x,则使用%f,否则使用%a。 (b) 如果 x 是float f中的值,并且%f产生一个数字,当使用舍入到最近模式正确舍入转换为 IEEE-754 binary32(“单个”)时,使用%f,否则使用%a。 (c) 如果 x 是float f中的值,并且%f生成一个数字,当使用当前实现的舍入转换为float时,使用%f,否则使用%a。 -
@pmor 我突然想到,您的问题与经典且经常被问到的“如何在最小空间内以最大精度打印浮点数?”有很多共同点,并且有些因此,Printf width specifier to maintain precision of floating-point value 的答案可能适用。
标签: c floating-point printf precision c11