【问题标题】:C++ fixed point library? [closed]C++定点库? [关闭]
【发布时间】:2010-05-31 20:01:49
【问题描述】:

我正在寻找一个免费的 C++ 定点库(主要用于嵌入式设备,而不是用于任意精度数学)。基本上,要求是:

  • 没有不必要的运行时开销:任何可以在编译时完成的事情,都应该在编译时完成。
  • 能够在定点和浮点之间透明地切换代码,没有固有的开销。
  • 定点数学函数。如果您需要来回投射以求平方根,那么使用定点没有多大意义。
  • 占地面积小。

有什么建议吗?

【问题讨论】:

标签: c++ math fixed-point


【解决方案1】:

有一个开源定点数学库项目,可以通过以下链接找到:

它是一个为 C++ 用户提供 C++ 类接口的 C 静态库,它实现了以下功能: 触发。函数:sin、cos、tan、asin、acos、atan、atan2 饱和算术:sadd、ssub、smul、sdiv 其他函数:sqrt、exp

只支持16.16 fixed-point datatype

这是一个积极开发的开源项目(寻找感兴趣的开发者)。

【讨论】:

  • 为什么只支持Q16.16?所以最大值是 65536。对于很多情况来说还不够。
  • 16.16 是最常见的,如果出于性能原因使用定点,则不太可能使用超过 32 位(我不知道任何 64 位微控制器)。还有一些其他次要格式,如 24.8 或 8.24,我猜有大量奇怪的格式,但如果您正处于需要这些格式的阶段,那么您可能只需要手动编写代码(就像我通常做的那样)。
  • 死链接......
  • 据我所知,代码现在在 github 上:github.com/PetteriAimonen/libfixmath
【解决方案2】:

查看以下两个关于在 C++ 中处理定点表示的良好实现(不需要外部库)。

  1. Fixed-Point-Class 由 Peter Schregle 提供。它还有效地实现了加法乘法除法等基本运算。

    代码示例:

    #include <fixed_point.h>
    using namespace fpml;
    
    main()
    {
        fixed_point<int, 16> a = 256;
        fixed_point<int, 16> b = sqrt(a);
    }
    
  2. Implementing Fixed-Point Numbers in C++ by Khuram Ali。

【讨论】:

  • 对于那些关心 Boost 的人,Peter Schregle 的第一个链接使用了 Boost。
【解决方案3】:

这是 GitHub 上的一个开源定点库:

https://github.com/mbedded-ninja/MFixedPoint

它支持 32 位和 64 位定点数(具有任意商)和快速(一切都是模板化的,但需要更多手动操作)和慢速定点数(更自动,但更慢)。

它面向嵌入式平台,但是我在微控制器和 Linux 上都使用过它,没有任何问题。

【讨论】:

    【解决方案4】:

    我有一个不错的小 c++ 头文件。您可以在sweet::Fixed 下找到它。简单定义 typedef sweet::Fixed MyFloat;并像任何其他浮点值一样使用它。或者稍后交换您想要的任何浮点类型。该类有两个 64 位值。一个用于整数部分,一个用于小数部分。

    我在sweet.hpp 中有一个小的定点 c++11 类头 impl,名为 fixed.hpp。两个部分都使用 32 位。

    typedef float MyFloat;         // This will feel the same
    typedef sweet::Fixed MyFloat;  // like this
    

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        也许您可以尝试 GMP 或 MPFR 库。我很确定它们会满足你的性能需求,但也许它们对你的需求来说太多了,你想要更轻量级的东西。不管怎样,看这里:

        GMP library

        或这里:

        MPFR library

        【讨论】:

        • 不错的库,良好的 C++ 绑定。但两者都只支持大整数、有理数和大浮点数:我认为它们都不支持定点。
        • 我的错,我错误地认为你的意思是“浮点”。我以后应该更仔细地阅读这个问题。对不起。
        【解决方案7】:

        我从未使用过SPUC,但描述声称定点数据类型和一些数学函数。

        【讨论】:

        • 我看到网站上提到了“定宽整数”,但没有提到定点值。你能告诉我图书馆的定点部分吗?
        • @BrooksMoses - 他们是一回事。固定宽度意味着您可以指定小数点的位置,然后在所有数学运算中保持在该固定位置。
        • 你确定吗?我正在查看spuc.cvs.sourceforge.net/viewvc/spuc/spuc/generic/… 中他们的“固定宽度整数”实现的核心,这看起来像是小数点左侧具有特定宽度的整数的实现(因此“长”基础类型中的剩余位是只是被掩盖了),而不是定点数。关键是乘法没有缩放,如果小数点不在数字的右端,我会期望。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 2015-01-30
        • 2012-04-07
        • 2011-02-03
        • 2010-10-02
        • 2010-09-08
        相关资源
        最近更新 更多