如何测试浮点宏?
是否与“LaTeX(3)”中未实现的其他库进行了比较?
是否遵守 IEEE 浮点运算标准?
答案1
的测试套件expl3
用于测试 FP 代码。该系统通过将运行一个或多个函数的结果与一组“经过认证”的结果进行比较来工作。*因此,对 FP 结果的常规测试基于从外部源预先计算的结果。
FP 计算的参考值由布鲁诺·勒弗洛克他在 2011 年左右编写了当前代码。Bruno 没有记下提交日志中值的来源,但有很多方法可以获取符合 IEEE 754 标准的值。例如,在 Lua 中可以使用
print(string.format("%.16g", <calculation>))
生成比较值。也可以使用更高精度的系统并向下舍入:Wolfram Alpha 是一种易于使用的方法。
*编写测试时,我们使用简单的 Perl 脚本进行日志比较,并使用批处理文件/Make 作为后端。从那时起,我们已转向l3build
能够即时生成比较结果的 。因此,可以使用外部工具(最容易使用的 Lua)来生成“正确”的结果。但是,这只会减慢测试速度,而不会真正增加多少。
答案2
l3fp 实现 IEEE 754十进制算术(已成为IEEE 754 自 2008 年起)
精度大致相当于更广为人知的 IEEE“双精度”二进制算术,但结果可能有所不同。
例如,0.1 可以精确存储为十进制浮点数,但不能存储为二进制数。这使得以下示例成为可能
\documentclass{article}
\begin{document}
\makeatletter
\def\foo{ceil(2.00 - (0.90 + 0.50 + 0.45 + 0.15))}
\directlua{
ceil=math.ceil
print(string.format(
"\string\n Lua : \@percentchar.32g", \foo))}
\typeout{l3fp: \fpeval{\foo}}
\end{document}
产生
Lua : 1
l3fp: 0
因此,差异恰好为 1,如果将值四舍五入到更高的精度,则该差异不会消失。
此处数学上正确的值是 l3fp 返回的 0,但 Lua 值没有错误,它是双精度算术要求的值。(本质上天真地显示了编程错误:应用将ceil
微小的舍入误差转换为 1 的差值,但使用十进制算术在此处没有舍入误差。)
除了实施问题之外,使用十进制算术对于典型的排版任务很有用,例如加钱或考试成绩,如果用户未能正确四舍五入,他们可能会惊讶地得到总计 99.99998 的百分比。