【问题标题】:Library used by Microsoft calculator微软计算器使用的库
【发布时间】:2014-04-25 18:52:14
【问题描述】:

从未接触过 Microsoft 的 Windows 7 计算器程序。计算器程序的精度高达小数点后 32 位,真是令人惊讶。 Microsoft 肯定不会使用 MPIR 或其他将数字视为字符串的库。计算器程序是否使用了内在函数?

我想编写一个程序来使用这些内在函数计算双精度到小数点后 32 位的对数。

【问题讨论】:

  • this 这样的东西怎么样?
  • 我很确定他们的浮点使用 10 字节扩展精度浮点数。这是英特尔本机支持的数字格式。在整数方面,它是 64 位,由 MS C 编译器原生支持。
  • 10 字节 = 80 位,其中 64 位是“尾数” -> 大约 20 位。
  • @SevaAlekseyev 它能够表示一个 epsilon 远小于二进制 80。据我所知,它是 binary128 类型,有 112 个尾数位。

标签: c++ assembly sse


【解决方案1】:

我完全不知道 MS 在计算器中使用了什么数学库(如果它首先是一个“库”,而不仅仅是整个计算器代码的一部分)——我也不想知道——但是为计算器编写“多精度”函数并不难。这个措辞的关键部分是“用于计算器”,因为数学并不需要特别快。只要你能完成四个基本的数学运算(+-*/),其余的都可以使用各种级数计算产生。对于 30 位精度,您可能需要比常规 floatdouble 类型获得的 8-16 位多一些循环,但由于我们在谈论“计算器”,所以这并不重要,因为只要结果在十分之几秒内返回,就可以了。现代桌面处理器将在一秒钟内执行数百万条指令。

我 99% 确定不涉及内在函数,因为没有对“大型数学”的直接硬件支持,并且内在函数通常实现硬件功能(例如 SSE、AVX 等)。

Taylor Series 的维基百科页面显示了 logsin 的系列,Mathematical Series 页面有更长的不同系列计算列表。通常,如果您通过循环跟踪因子和除数,则可以通过每次循环迭代的加法、除法和乘法来完成这些级数计算。

编辑:计算器很可能在可能的情况下使用 C# 语言中的 decimal 类型。

【讨论】:

猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多