【问题标题】:In Delphi, what's the keyword for the maximal value for a floating point type?在Delphi中,浮点类型最大值的关键字是什么?
【发布时间】:2014-04-29 07:43:21
【问题描述】:

注意:这个问题已被编辑,因为我的问题变得完全不同。您将在 MBo's answer 中找到问题 What's the keyword for the maximal value for a floating point type? 的直接答案 - 使用 System.Math 的常量。

Delphi 提供了多种浮点值类型。 开头有 Single、Double 和 Extended。

上周我查找了最大浮点值的关键字是什么,发现:http://www.delphibasics.co.uk/RTL.asp?Name=Infinity

var
  float1, float2 : single;
begin
  float1 := Infinity;
  float2 := 23;

  ShowMessage('float1 = '+FloatToStr(float1));
  ShowMessage('float2 = '+FloatToStr(float2));
  ShowMessage('float1 - float2 = '+FloatToStr(float1 - float2));
  ShowMessage('-float1 = '+FloatToStr(-float1));
end;

假设输出

float1 = INF
float2 = 23
float1 - float2 = INF
-float1 = -INF

我有一个带有组件的表单。这个组件有几个属性。 如果我使用属性编辑器将 Infinity 作为浮点属性的值,我会收到错误,即它是无效的浮点值。 INF 也是如此。

然后我在 MaxValue 字段中输入了9.9E308。它变成了INF。

对此感到相当高兴,我保存了我的表格并继续我的工作。那天晚些时候我编译了表单,成功地测试了表单可以保存1E308的值。

第二天……

在记事本中打开 .dfm 文件给了我这个:

object gridDoubleEditor: TdgmrGridDoubleEdit
  Tag = 0
  WantKeyLeftRight = False
  WantKeyUpDown = False
  WantKeyHomeEnd = False
  WantKeyPriorNext = False
  EmptyString = '--'
  EmptyValue = -1E300
  MinValue = -1E300
  MaxValue = INF
  NumberOfDecimals = 2
  Alignment = taRightJustify
  Left = 336
  Top = 208
end

怎么会自动把9.9E308改成INF,编译成功,保存成功,加载失败?这是我IDE的bug吗?我在 Windows 7 上使用 Embarcadero® Delphi® XE5 版本 19.0.14356.6604,32 位。

【问题讨论】:

  • 如果出现奇怪的错误,首先要做的是关闭/重新打开 IDE,重新打开项目并重建(不仅仅是重新编译)项目。

标签: delphi delphi-xe5


【解决方案1】:

System.Math 单元包含 Infinity 常量来表示 IEEE754 Inf 伪值 (1.0/0.0)。这个单元中还有很多 MaxDouble、MaxExtended 等常量(看Variables section here)。这个简短的测试可以根据需要进行,因此我怀疑您的组件可能进行了某种范围检查或具有不理解未知标识符的属性编辑器。

  TTest = class(TComponent)
  private
    FValue: Double;
    procedure SetValue(const Value: Double);
  public
    property Value: Double read FValue write SetValue;
  end;


procedure TForm1.Button26Click(Sender: TObject);
begin
  with TTest.Create(Self) do try
    Value := Infinity;
    Caption := FloatToStr(Value);
  finally
    Free;
  end;
end;

附:您需要使用 Infinity 作为字段值,还是仅确保字段值 > -1E300?

附言 为什么您仍在使用 INF,而不是 Infinity? 顺便说一句,我发现一个组件具有浮动发布属性 - 对象检查器不理解 Infinity - 所以 属性编辑器不是为这些目的而设计的,正如我已经假设的那样,但我可以分配 Infinity在代码中。

【讨论】:

  • 有没有办法访问这些常量,以便我可以将它们分配给表单对象的属性?导入 System.Math 确实允许我将 Infinity 分配给浮点变量,但我仍然无法将值分配给我的表单对象的属性。它说Infinity is not a valid floating point value(所有变体都会出现类似的消息-System.Math.Infinity、Math.Infinity、MaxSingle、Math.MaxSingle、System.Math.MaxSingle...)
  • 哦,我看错了你的问题(看了INF,没注意到Infinity)。您能否显示产生此错误的 96-97 行代码。
  • 那些只是测试行,带有 var f: Double;开始 f := INF; f := 无穷大;结束...
  • 真正的问题是我有一个带有组件的表单,它曾经接受 INF 作为属性。但是现在突然发现这样的事情是非法的。
  • @Pimgd,你能把代码缩小到最低限度并提供一个可编译的例子吗?
猜你喜欢
  • 2011-06-29
  • 2016-08-09
  • 1970-01-01
  • 2019-06-16
  • 2011-08-18
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多