在Delphi中,浮点类型的最大值是什么关键字?

时间:2014-04-29 07:43:21

标签: delphi delphi-xe5

注意:此问题已被编辑,因为我的问题变得完全不同了。您将在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

Form Attributes

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

第二天......

Error on restarting IDE

在记事本中打开.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中的错误吗?我在Windows 7上使用Embarcadero®Delphi®XE5版本19.0.14356.6604,32位。

1 个答案:

答案 0 :(得分:5)

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;

P.S。您是否需要使用Infinity作为字段值,或者只是为了确保字段值> -1E300?

<强> P.P.S。 你为什么还在使用INF,而不是Infinity? 顺便说一句,我发现一个组件有浮动发布的属性 - 对象检查器不了解无限 - 所以属性编辑器不是为这些目的设计的,因为我已经想到了,但我可以在代码中指定无限。