Альтернатива функции sqrtf в Visual Studio - PullRequest
0 голосов
/ 24 января 2020

Я пишу проект в Visual Studio, затем использую G CC для его компиляции. Иногда это вызывает некоторые проблемы: на этот раз я не могу использовать функцию sqrtf, потому что VS принимает ее, а G CC - нет. Поэтому мне нужно найти какой-то способ (возможно, математический подход для вычисления квадрата root), чтобы найти квадрат root некоторого числа таким образом, как G CC и VS примут. Чтобы быть более точным, эта строка вызывает проблему:

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

Мне нужно найти квадрат root из (circleRadius ^ 2 - y ^ 2)

Ответы [ 2 ]

3 голосов
/ 24 января 2020

std::sqrt решает эту проблему:

#include <cmath>

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

компилирует для msv c и g cc в соответствии с https://godbolt.org/z/g9MJH6

Вы должны предпочитают std::sqrt sqrtf в C ++. Он работает с большим количеством типов, то есть вы можете написать свою функцию более обобщенно. Также не используются венгерские обозначения.

Редактировать: Если вам все равно, возвращает ли вычисление число с плавающей запятой или двойное число, вы можете опустить приведение и написать следующее:

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

Если вы заботитесь о том, чтобы использовалось число с плавающей запятой , вместо этого вы можете использовать std::sqrtf. Если вам нужно использовать приведение, вы обычно предпочитаете приведение в стиле от static_cast до C. Причины этого перечислены здесь .

0 голосов
/ 24 января 2020

Ваша ситуация может быть, если вы используете более новый компилятор в V C и более старый компилятор в g cc.

Попробуйте использовать sqrt или sqrtf WITH

#include <math.h>

Don ' t *

#include <cmath>

math.h должен иметь определения sqrt, sqrtf для обоих компиляторов.

...