- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在短暂查看 system.math 的源代码时,我发现64 位版本 Delphi Tokyo 10.2.3 将非正规 IEEE-Doubles 刷新为零,从以下程序中可以看出;
{$apptype console}
uses
system.sysutils, system.math;
var
x: double;
const
twopm1030 : UInt64 = $0000100000000000; {2^(-1030)}
begin
x := PDouble(@twopm1030)^;
writeln(x);
x := ldexp(1,-515);
writeln(x*x);
x := ldexp(1,-1030);
writeln(x);
end.
对于 32 位,输出符合预期
8.69169475979376E-0311
8.69169475979376E-0311
8.69169475979376E-0311
但是对于 64 位我得到
8.69169475979375E-0311
0.00000000000000E+0000
0.00000000000000E+0000
所以基本上东京可以在 64 位模式下处理非正规数,常量写入正确,但是从算术运算甚至使用 ldexp 时,非正规结果会被刷新为零。
这个观察结果可以在其他系统上得到证实吗?如果有,记录在哪里? (我能找到的关于零冲洗的唯一信息是,存储在 Real48 中时非正规数变为零
)。
更新:我知道两者 32 位和 64 位都使用单一重载。对于 32 位,使用 x87 FPU,并且所有精度(单精度、 double 、扩展精度)的 ASM 代码实际上都是相同的。 FPU 始终返回 80 位扩展,该扩展存储在 double 型中,而不会提前截断。 64位代码在存储前进行了精度调整。同时,我提交了一份问题报告 ( https://quality.embarcadero.com/browse/RSP-20925 ),重点关注 32 位或 64 位的不一致结果。
最佳答案
更新:
仅编译器处理重载选择的方式有所不同。
@Graymatter 发现,对于 32 位和 64 位编译器,调用的 LdExp
重载都是 Single
类型。唯一的区别是代码库,其中 32 位编译器使用 asm 代码,而 64 位编译器具有 purepascal 实现。
要修复代码以使用正确的重载,请显式定义 LdExp()
第一个参数的类型,如下所示(64 位):
program Project116;
{$APPTYPE CONSOLE}
uses
system.sysutils, system.math;
var
x: double;
const
twopm1030 : UInt64 = $0000100000000000; {2^(-1030)}
begin
x := PDouble(@twopm1030)^;
writeln(x);
x := ldexp(Double(1),-515);
writeln(x*x);
x := ldexp(Double(1),-1030);
writeln(x);
ReadLn;
end.
输出:
8.69169475979375E-0311
8.69169475979375E-0311
8.69169475979375E-0311
<小时/>
我想说,这种行为应该被报告为 RTL bug,
,因为在您的情况下选择的重载函数是
因为 32 位和 64 位编译器应该产生相同的结果。Single
类型。生成的类型是
Double
,编译器肯定应该相应地进行调整。
注意,浮点类型的 Double(1)
类型转换是在 Delphi 10.2 Tokyo 中引入的。之前版本的解决方案参见What is first version of Delphi which allows typecasts like double(10) 。
关于Delphi Tokyo 64 位将非正规数刷新为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51445586/
我正在评估 Tokyo Cabinet Table引擎。在达到100万条记录后,插入速度会大大降低。批量大小为100,000,在事务内完成。我尝试设置xmsiz,但仍然没有用。 Tokyo Cabin
FAL Labs拥有多个东京产品和京都产品: Tokyo Cabinet 和 Kyoto Cabinet 都是轻量级数据库。 Tokyo Tyrant 和 Kyoto Tycoon 都是轻量级数据库服
有人可以引用关于 Tokyo Cabinet 和东京暴君的好教程吗 最佳答案 除了Tokyo Cabinet的官方主页和 Tokyo Tyrant , 我找到了 Ilya Grigorik's blo
只需连续 3 个小时尝试解决 Linux 中 Eclipse 中的 java.lang.UnsatisfiedLinkError: no jtokyocabinet in java.library.p
发现 Delphi Tokyo 中的异常处理行为与以前的 Delphi 版本略有不同。 function FuncTest: integer; begin Result := 1; try
我是 tokyo Cabinet 的新手,我已经安装了它并且我已经运行了示例 C 程序,但出现错误...当我用 gcc 编译时 gcc -O tcadbex.c /tmp/cc7IEOht.o: In
在短暂查看 system.math 的源代码时,我发现64 位版本 Delphi Tokyo 10.2.3 将非正规 IEEE-Doubles 刷新为零,从以下程序中可以看出; {$apptype c
我已经在 TC 上实现了一个队列(具体来说是东京暴君)。我正在使用 memcache 兼容函数增量来跟踪队列头和尾。我只想知道 TC 存储的整数(64 位?)的限制是多少,以及在存储的数字达到允许的最
我正在尝试通过 tokyo-python 包在 Python 中使用 Tokyo Cabinet。我已经安装了 Cabinet 和 Cabinet 开发库。然而,每当我尝试使用 pip 或 easy_
我有多个项目组要批量编译。那里有100多个项目。 2010 年我们有一个这样的“make”文件: call "c:\Borland\RAD Studio\19.0\bin\rsvars.bat" "c
我在一篇名为“动手 Cassandra”的文章中读到 Tokyo Cabinet不利于大数据。为什么? TC 在开始工作之前需要存储多少字节?是否可以确定一个近似值? 最佳答案 基于 this art
我有超过 1 亿个键值对(一个键可以有多个值)。我正在使用 Tokyo Cabinet 的 BDB (B+Tree DB),其键值是 32 位字节数组。 是否可以在 Tokyo Cabinet 中设置
是否可以将 Tokyo Cabinet 与任何 .Net 语言一起使用,最好是 VB10?东京暴君呢?最好不通过 LUA/Ruby 或其他包装器.. 如果没有简单的方法,您能推荐其他可以使用的快速键值
有没有人在大型数据集上成功使用 Tokyo Cabinet/Tokyo Tyrant?我正在尝试上传维基百科数据源的子图。在达到大约 3000 万条记录后,我的速度呈指数级下降。 HDB 和 BDB
它基本上是一个二叉树,它首先搜索哈希来决定它是左还是右: if(hash > rec.hash){ off = rec.left; entoff = rec.off + (sizeof(uin
我在 python 中使用 Tokyo Cabinet 和 tc 模块。我以 TDB 格式存储我的数据。我希望该表仅在写入期间阻塞。不幸的是,我看到当文件以“编写器模式”打开时,其他进程无法从中读取。
我想在运行查询之前确定对 Tokyo Cabinet 表的查询将返回的记录数。我使用 rufus-tokyo Ruby gem 作为我的界面。执行此操作的最佳方法是什么? 最佳答案 仔细查看githu
有人比较过 SimpleDB 和 Tokyo Cabinet 的性能和可伸缩性吗?我目前正在针对 SimpleDB 编写我的项目并考虑对 TC 进行基准测试,如果有人已经完成并可以告诉我是否值得测试我
我正在将用 Delphi 7 编写的旧项目转换为最新版本(Delphi Tokyo),在旧代码中,有一个对文本进行加扰和反扰乱的函数,但是当我使用在 Delphi 中编译的相同程序读取加扰文本时东京只
我对Delphi Tokyo感到非常沮丧。我离开了Delphi Xe7,另一个令人沮丧的错误(内存不足)消失了(或者直到现在为止),但是出现了一个新错误。 当我通过代码仓库更新项目时,通常需要重新构建
我是一名优秀的程序员,十分优秀!