【问题标题】:Does cmath borrow it's implementation from math.hcmath 是否从 math.h 借用了它的实现
【发布时间】:2023-03-04 08:42:01
【问题描述】:

我想为嵌入式应用程序从 math.h 切换到 cmath。我对从 math.h 切换到 cmath lib 有点怀疑,因为这个嵌入式系统对计算精度的变化非常敏感。所以我想知道 cmath 是否借用了它的实现并包装了 c++ 兼容代码?还是 c++ 有它自己的实现与不同的实现?

【问题讨论】:

  • 这取决于实现(编译器和库)。我还没有看到任何提及具有<math.h><cmath> 的任何实现以影响数值精度的方式表现不同(当然,假设使用相同的选项进行编译 - 某些编译器确实具有更改浮点表示的选项) .
  • 看起来像您在询问 cmath 是否使用 math.h 的 X-Y 问题,但实际上担心在嵌入式系统中使用 cmath 的后果。
  • cmath 只是 math.h 的 C++ 替代语法。在制定 ISO 标准的平行宇宙中,90 年代初的一些预言家预测未来的操作系统不会有文件扩展名。因此,这个平行宇宙中的标准委员会试图从 C++ 中删除 #include <lib.h>。所以 C 标准库必须包含在 #include <clib> 中。如果这对您来说似乎是一件非常愚蠢的事情,那是因为它是一件非常愚蠢的事情。 30 年后,操作系统仍然有文件扩展名......
  • @Lundin :我认为标准头文件中 .h 的省略早于 ISO 标准化。 Stroustrup 对此进行了解释。文件扩展名意味着文件,而实现可能具有“内置”库函数并使用 include 指令作为“开关”以使函数可用而无需实际读取文件。 IE。并不是操作系统可能没有文件扩展名,而是“标题”不必是文件。我并不是说这个理由很有说服力,只是说它不像你所说的那样考虑不周。

标签: c++ embedded math.h cmath


【解决方案1】:

是否包含 cmath 会导致包含 math.h 严格取决于具体实现。然而,两者都只是声明性的,是否包含任何一个会导致相同的对象库代码被链接也是特定于实现的。也就是说,一个实现很可能会使用相同的代码,并且通常 math.h 将是一个嵌套包含在 .

cmath 为 floatlong double 和整数类型添加了重载,而在 math.h 中几乎只使用 double。这可能会导致更优化的实现,或者它可能只是转换为 C 库函数的类型 - 同样它是特定于实现的。

因为这个嵌入式系统对计算精度的变化非常敏感。

如果您与 math.h 声明的函数没有精确的类型一致性,行为可能会改变。例如,如果您有 float 参数隐式转换为 double math.h 参数,则使用 cmath 可能会导致使用更好的匹配重载。

所以我想知道 cmath 是否借用了它的实现并包装了 c++ 兼容代码?还是 c++ 有它自己的不同的实现?

检查您的实现,对其进行测试,并验证您的代码具有正确的类型协议以避免使用重载。也就是说,如果你这样做了,那么使用 cmath 并没有什么令人信服的优势——其主要好处是重载 double 以外的类型,从而可能产生更高效的代码。它可能具有显着的性能优势,例如,如果您的处理器具有单精度 FPU 或没有 FPU,并且您使用 float 来提高效率。

您最好的解决方案是构建它并对其进行彻底测试。由于它是特定于实现的,因此您必须针对您的特定工具链和目标对其进行测试,因为语言或库规范没有定义它应该如何完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2016-08-30
    • 2016-12-31
    • 2013-03-17
    • 1970-01-01
    • 2011-09-27
    • 2021-03-24
    相关资源
    最近更新 更多