【问题标题】:How to format MinExtended80Denormal?如何格式化 MinExtended80Denormal?
【发布时间】:2018-09-06 10:45:49
【问题描述】:

单位System.Math定义常量

MinExtended80Denormal

我可以使用给定的 rtl 函数将此数字转换为字符串吗?

我试过了

FormatFloat('#.##############E+####', System.math.MinExtended80Denormal)

导致

000000000000000E+00000

我也尝试过更大的非规范化值,但似乎内置格式化函数不支持这些值(其中指数为零)。

【问题讨论】:

  • 对我来说,FormatFloat() 会返回 0E+0。但无论哪种方式,我都可以重现这个问题。科学输出必须是FormatFloat() 中的错误
  • 你为什么要问?您想将此特定值表示为文本,还是想将任意非规范化表示为文本?
  • 我假设最小的 Extended 80 denormal 非常小,非常接近 0(可能只是尾数中的一点),因此您将无法使用 FormatFloat 对其进行格式化。
  • 我猜这里是东京 - 我认为之前的版本中没有定义常量。
  • @David:我想我最清楚我想要找出什么。我从来没有说过我已经有解释了。这些是 cmets,而不是答案。

标签: delphi string-formatting delphi-10.2-tokyo extended-precision


【解决方案1】:

使用系统内置的打印功能可以正常工作:

uses
  Math;
var
  s:String;
begin
  Str(MinExtended80Denormal,s);
  WriteLn(s);
  WriteLn(MinExtended80Denormal);
  Str(MinExtended80Denormal:26:-1,s);
  WriteLn(s);
  WriteLn(MinExtended80Denormal:26:-1);
end.

输出:

3.64519953188247E-4951
3.64519953188247E-4951
3.64519953188247460E-4951
3.64519953188247460E-4951

常量 MinExtended80Denormal 定义为:3.64519953188247460253e-4951 所以最好的结果是给出除最后三位小数之外的所有数字。


我也尝试了WriteLn(MinExtended80Denormal.ToString),但结果是0

【讨论】:

  • 鉴于这是最小的非正规化,所以没有必要讨论输出多少小数位。您已经失去了所有有效数字前面的所有零的精度!
  • @DavidHeffernan,如果有可逆的可能性(从价值到文本再回到价值),那将是一件好事。不过,我不知道这对 OP 是否重要。
  • @LURD 往返格式(即格式化,如果再次读入输出,您将获得相同的值,并且因此不再输出数字以获取值)是不是那么容易,尤其是对于这么小的值。我怀疑系统或数学例程能够做到这一点。往返格式通常也较慢,尽管在该领域取得了进展。
  • @LURD:4e-4951 的输出也会往返,即再次给你十六进制值 $0000000000000001。所以你真的不需要很多 precision 来往返。往返格式化的目标是输出返回结果所需的最低精度(最少位数)。
  • Python 是了解往返行程的有用工具。它的格式化例程输出唯一定义值所需的最短有效数字位数。用最小非正规做到这一点,你会得到一个有效数字。
猜你喜欢
  • 1970-01-01
  • 2011-06-14
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多