C++ 128 位固定十进制库

C++ 128 bit fixed decimal libraries

提问人:intrigued_66 提问时间:11/6/2022 更新时间:11/6/2022 访问量:169

问:

我编写了自己的 Decimal 类,它使用尾数。我相信这意味着它可以表示 18 位数字(如果没有符号,则为 19 位)。int64_t

我需要表示两个数字范围:

  • A 型高达 99,999,999
  • B型小至1e-9。

到目前为止,这很好,因为这些数字只是加/减。但是,我现在需要相互乘法和除法。

我担心我快用完数字了。

  1. 我应该改用 128 位吗?
  2. 是否有任何简单/简单的 128 位 C++ 十进制库?
  3. 我可以简单地用我的替换吗?int64_t__m128i

我不是在编写公共/库代码,我的架构将永远是 Linux x86。我目前正在使用 GCC,但可以切换到 Clang。

C++ x86 浮点 十进制 精度

评论

2赞 11/6/2022
__m128i 不是 128 位有符号整数类型!
1赞 chux - Reinstate Monica 11/6/2022
mezamorphic,“到目前为止,这很好,因为这些数字只是加/减。 --> 发布该代码将有助于了解您成功完成的工作的细节。如果没有尝试“乘法除法”的代码,就不清楚你遇到了什么具体问题。“我担心我快用完数字了”,不足以解释这个问题。发布您的代码以改进问题。
2赞 Brendan 11/6/2022
@mezamorphic:对于标度点算术,底层大小、范围和精度之间存在不可避免的折衷,每个算术运算都会改变这种折衷。仅支持一种格式(例如“小数点前 32 位,小数点后 32 位”)的库无法应对不断变化的“最佳折衷方案”。当特定表达式需要 128 位整数类型时,您应该使用 128 位整数类型(例如,GCC 或 Clang 中的扩展名)(可能仅适用于在其他任何地方使用 64 位整数的表达式中间的 2 次操作)。__int128
1赞 Peter Cordes 11/6/2022
您可以将其视为 128 个连续位,但只能使用正确的内部函数来提取其中的部分内容。(或者也许将字节复制到其中和从中复制)。这不会有效地编译。如果你的意思是像 ,不,它不会在 MSVC 中编译,并且在根据 GNU C 扩展定义的编译器中,它将是两个(有符号)半部分的两个右移。(就像指令一样。如果没有 AVX-512 for ;SSE/AVX2 只有 8/16/32 位的算术右移)__m128imemcpyv <<1 1__m128ilong longpsllqvpsraq
2赞 Peter Cordes 11/6/2022
godbolt.org/z/f7nfz1onh 显示了 << 和 >> 如何编译 。它不是标量类型。有关有用的类型(使用 GNU C 扩展),请参阅 gcc 中是否有 128 位整数?在 C 中计算 64x64 int 乘积的高 64 位__m128i

答: 暂无答案