【问题标题】:double to int conversion not working using math.h functions in c使用 c 中的 math.h 函数无法将 double 转换为 int
【发布时间】:2015-04-27 20:13:48
【问题描述】:
dataBuf[1] = acos(0.130f);

这是我正在运行的代码,但是当我打印出结果时,它显示为 1 而不是 82。dataBuf 是一个 int16_t 数组。所有其他 math.h 函数都可以正常进行转换,但 trig 函数不起作用。

【问题讨论】:

  • Trig 的单位是弧度,而不是度数。
  • 并确认,我是个白痴
  • acos(0.130f) * 180 / M_PIl
  • acos 接受double 类型的参数(并返回相同类型的结果)。 acos(0.130) 会更有意义。如果您真的想使用float,请使用acosf(0.130f)。为了将来参考,不要只告诉我们您打印了结果,而是告诉我们如何。一个常见错误(您显然没有在这里犯)是使用了错误的 printf 说明符。
  • @Keith Thompson 我在微控制器上使用它,并通过 UART 传输结果。我认为这会使问题变得更复杂,所以我决定不把它放进去。

标签: c int double type-conversion math.h


【解决方案1】:

math.h 中的三角函数使用弧度,而不是度数。您可以通过乘以180 / pi,将弧度转换为度数,(57.29577951308232)。

acos(0.13) 将返回1.440427347091751 弧度乘以57.29577951308232 得到82.53040768358306 度数的结果。

【讨论】:

    【解决方案2】:

    OP 期望以度为单位的结果,但 acos() 返回以弧度表示的结果,正如 @Antti Haapala 所解释的那样。

    此外,OP 代码经历int 截断而不是舍入。示例:尝试计算 90 度的结果时。 acos(0) --> 1.570796...。将此值转换为度数时,结果可能会小于90.0,如89.999999999...。当它转换为int16_t 时,结果将被截断为 89,而不是90 所希望的。最好在转换为整数之前四舍五入浮点值。

    dataBuf[1] = (int16_t) round(acos(0.130f) * 180/M_PI);`
    // or using float functions
    const float r2d = 180/M_PI;
    dataBuf[1] = (int16_t) roundf(acosf(0.130f) * r2d);`
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2018-11-24
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2011-05-10
      相关资源
      最近更新 更多