【问题标题】:Set a Currency value to NAN, INF or -INF?将货币值设置为 NAN、INF 或 -INF?
【发布时间】:2011-10-29 03:28:54
【问题描述】:

我想测试一些代码以确保它能够正确处理NANINF-INF 输入。

我知道there exists functions that returnNANINF-INF,但作为Double

unit IEEE754;
...
function NAN: Double;
function PositiveInfinity:  Double;
function NegativeInfinity:  Double;

除了在我的情况下,我需要测试 Currency 何时是这三个边缘情况值之一。不幸的是,您无法将其中任何一个转换为Double

Test(NAN);

procedure Test(const Value: Currency);
  ...

Double NAN 转换为Currency 时出现EInvalidOp 无效浮点运算异常。

可能NAN分配给Currency吗?

也许,将NAN 分配给Currency 不是可能,而是不可能 - 我可以忽略这种极端情况.

我可以忽略这种极端情况吗?

是否可以“将货币值设置为 NAN、INF 或 -INF?”


{   David Heffernan says it's impossible for a currency to contain INF,-INF or NAN.
    So there's no need to test for it.
    http://stackoverflow.com/questions/7096966/set-a-currency-value-to-nan-inf-or-inf

    //Handle NaN, where exponent is -32767
    test(NAN, 'NAN');

    //Handle +inf, where exponent is 32767 and Negative is true
    test(PositiveInfinity, 'INF');

    //Handle -inf, where expondent is 32767 and Negative is true
    test(NegativeInfinity, '-INF');
}

【问题讨论】:

  • 你添加的代码到底应该是什么?货币没有指数
  • 您正在查看一段 sn-p 代码,却没有意识到它在测试什么。您可能还记得,Exponent 是 Delphi 的 FloatToDecimal 返回的“指数”,它将货币转换为 DigitsExponent。 (stackoverflow.com/questions/7069204/…)
  • 确实如此。我正在看一段代码,除非你能理解。所以我想知道为什么它被发布。我知道 FloatToDecimal 的作用,它不是在货币参数的情况下你期望它做的事情。我猜你的代码应该是某种证明,但由于没有人可以遵循它,它不能很好地达到这个目的。
  • 它诞生于公认答案的 cmets。
  • 但它完全没用,因为除了你之外没有人可以从中检索到任何意义。请注意,NANNegativeInfinityPositiveInfinity双倍,而不是货币

标签: delphi nan delphi-5 infinity


【解决方案1】:

货币不是 IEEE754 浮点类型,并且没有 NAN 或 INF 值。

documentation 解释说 Currency 被实现为 64 位整数,隐含比例为 10000,可能值的范围是 -922337203685477.5808 到 922337203685477.5807。由于这涵盖了 64 位整数的全部范围,因此没有可用于标记值(如 NAN 或 INF)的位模式。

【讨论】:

  • Currency 是 Int64,隐式缩放 10000。它是十进制而不是二进制,以避免以 10 为底的算术中的舍入错误。绝对没有 NAN 或 INF。如果它变成梨形,你可以怪我。它变成梨形。
  • Ian, Currency 是一个缩放的 64 位整数,而不是浮点类型。用它表示非数字是不可能的,因为所有位模式都表示实际值。它的范围与 Int64 相同,只是所有值都除以 10000。
  • 我知道它是 Int64,隐含 4 位数字;但由于 RTL 中有这个函数,其中“带隐式数字的整数”遇到浮点值......谁知道 Delphi 可能有什么边缘情况。
  • @Rob:IIRC,FloatToDecimal 的源代码不止几行汇编,还有一些嵌套的例程,而且不那么容易阅读。
  • @Mason:TFloatRec 的文档确实显示了名为 Exponent、Mantissa 等的字段。我想这就是他误解的地方。
猜你喜欢
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2016-01-03
  • 2019-01-09
相关资源
最近更新 更多