【问题标题】:sqrtf function alternative in Visual StudioVisual Studio 中的 sqrtf 函数替代
【发布时间】:2020-01-24 09:26:19
【问题描述】:

我正在 Visual Studio 中编写一个项目,然后我使用 GCC 来编译它。有时它会导致一些问题:这次我不能使用 sqrtf 函数,因为 VS 接受它但 GCC 不接受。所以我需要找到某种方法(也许是计算平方根的数学方法)以 GCC 和 VS 都接受的方式找到某个数字的平方根。更准确地说,这是导致问题的行:

float x_f = circleRadius - sqrtf((float)((circleRadius * circleRadius) - (y * y)));

我需要求 (circleRadius^2 - y^2) 的平方根

【问题讨论】:

  • To be more precise this is the line which causes a problem 哪一个?链接器错误?语法错误?
  • 请提供详细信息。 sqrtf 肯定是所有编译器都提供的。
  • 请提供问题的minimal reproducible examplesqrtf 肯定是可用的,至少从 C++11 开始。另请注意,显式强制转换是多余的。 std::sqrtf 已经将参数隐式转换为 float

标签: c++ visual-studio gcc


【解决方案1】:

std::sqrt 解决了这个问题:

#include <cmath>

auto foo(int circleRadius, int y) {
    float x_f = circleRadius - std::sqrt((float)(circleRadius * circleRadius - y * y));
}

根据https://godbolt.org/z/g9MJH6为msvc和gcc编译

在 C++ 中,您应该更喜欢 std::sqrt 而不是 sqrtf。它适用于更多类型,即您可以更通用地编写函数。它也不使用匈牙利符号。

编辑:如果您不关心计算返回的是浮点数还是双精度数,您可以省略强制转换并编写以下内容:

auto x_f = circleRadius - std::sqrt(circleRadius * circleRadius - y * y);

如果您关心使用浮点数,则可以改用std::sqrtf。 如果您必须使用演员表,您通常应该更喜欢 static_cast 而不是 C 风格的演员表。原因列在here

【讨论】:

  • 请注意,这也适用于std::sqrtf。 OP 的错误可能在于使用了错误的包含、忘记了 std:: 前缀或针对 pre-C++11 进行编译。
【解决方案2】:

如果您在 VC 中使用较新的编译器,在 gcc 中使用较旧的编译器,您的情况可能是这样。

尝试使用 sqrt 或 sqrtf WITH

#include <math.h>

不要使用

#include <cmath>

math.h 应该有两个编译器的 sqrt、sqrtf 定义。

【讨论】:

  • 我认为这不是一个好建议。相反,我建议始终使用#include&lt;cmath&gt; 并改用std::sqrtf。这将与标准库的其余部分更加一致。
猜你喜欢
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
相关资源
最近更新 更多