Delphi XE2-System.Str已更改/损坏?

Delphi XE2-System.Str已更改/损坏?,delphi,delphi-xe2,Delphi,Delphi Xe2,DelphiXe2中的System.Str发生了一些变化。以下程序: procedure someProcedure; var E:double; outString:string; begin E:=-1.7E+308; Str(E:i:j, outString); end; 引发访问冲突 (异常类别$C0000005,0x00407318处的访问冲突:读取地址0x30303028) 在Delphi XE2中,“i”和“j”是任意整数。这段代码在Delphi2010中运行良

DelphiXe2中的System.Str发生了一些变化。以下程序:

procedure someProcedure;
var 
  E:double;
  outString:string;
begin
  E:=-1.7E+308;
  Str(E:i:j, outString);
end;
引发访问冲突

(异常类别$C0000005,0x00407318处的访问冲突:读取地址0x30303028)

在Delphi XE2中,“i”和“j”是任意整数。这段代码在Delphi2010中运行良好,返回outString='-1.7E+0308'。类似的代码在TurboPower Orpheus的一些组件中使用,它会导致整个IDE因BEX错误而崩溃

这是在Win7 64位中。有什么想法吗

编辑:额外信息

这似乎只会发生在大量负数的情况下。Str似乎会生成长字符串,当它们超过约130个字符时就会中断

注意:仅使用宽度(其中i=某个宽度)时不会中断


这显然是一个处理大量负数的错误。正数处理得很好。如果您可以拦截对
Str
的调用,那么您可以确保您只调用
Str
传递正数,然后自己为
-
添加前缀


我已将该错误提交给质量中心:。

这显然是一个处理大量负数的错误。正数处理得很好。如果您可以拦截对
Str
的调用,那么您可以确保您只调用
Str
传递正数,然后自己为
-
添加前缀



我已将此错误提交给质量中心:。

在您撰写本文时,我添加了一些关于大型底片的内容。还有一个精度误差也会影响正值。@J。。。没有精度误差。这个数字不能准确地表示出来。无论如何,我会在有时间的时候对它进行质量控制。解决方法非常明显,但似乎是不应该首先打破的。感谢QC-我从未登录到EDN,也不记得我的详细信息。问题是一些涉及的函数已经用XE2的纯pascal重写,显然它们至少在系统中破坏了一些东西。\u Str2Ext(另请参阅)在你写这篇文章的时候,我添加了一些关于大底片的内容。还有一个精度误差也会影响正值。@J。。。没有精度误差。这个数字不能准确地表示出来。无论如何,我会在有时间的时候对它进行质量控制。解决方法非常明显,但似乎是不应该首先打破的。感谢QC-我从未登录到EDN,也不记得我的详细信息。问题是一些涉及的函数已经用XE2的纯pascal重写,显然它们至少在系统中破坏了一些东西。\u Str2Ext(另请参阅)这不是一个精确的错误。事实上,-1.6E117在二进制浮点格式中并不完全可表示。作为一种解决方法,您可能只需测试它是否小于0,将符号取反,然后在字符串中添加前缀“-”。实际上XE2是正确的<代码>1.6000000000000002E+0117正确。见罗伯·肯尼迪最有用的一页:@J。。。否,32位Delphi D2010、XE2等将不会保留
-1.6e+117
作为
扩展的
值,只要将其推入变量。Delphi编译器不执行浮点优化,而浮点优化是实现这一点所必需的。本质上,编译器需要将变量优化为浮点寄存器。但事实并非如此。差异必须仅存在于
Str
中。对于32位编译器,浮点运算的基本处理在D2010和XE2之间保持不变。不用担心。这是一个棘手的问题。这恰好是我特别感兴趣的一点,因为我的日常工作涉及数值计算。编译器行为方式的回归和变化对我来说非常重要。我认为32位编译器多年来没有太大变化,这不是一个精度错误。事实上,-1.6E117在二进制浮点格式中并不完全可表示。作为一种解决方法,您可能只需测试它是否小于0,将符号取反,然后在字符串中添加前缀“-”。实际上XE2是正确的<代码>1.6000000000000002E+0117正确。见罗伯·肯尼迪最有用的一页:@J。。。否,32位Delphi D2010、XE2等将不会保留
-1.6e+117
作为
扩展的
值,只要将其推入变量。Delphi编译器不执行浮点优化,而浮点优化是实现这一点所必需的。本质上,编译器需要将变量优化为浮点寄存器。但事实并非如此。差异必须仅存在于
Str
中。对于32位编译器,浮点运算的基本处理在D2010和XE2之间保持不变。不用担心。这是一个棘手的问题。这恰好是我特别感兴趣的一点,因为我的日常工作涉及数值计算。编译器行为方式的回归和变化对我来说非常重要。我不认为32位编译器已经改变了很多年。
procedure someProcedure;
var 
  E:double;
  outString:string;
begin
  E:=-1.7E+308;
  Str(E:i, outString);
end;