Arhn - архитектура программирования

Включение арифметических операций при определении константы

Поэтому я часто вижу что-то вроде этого:

#define gf_PI  f32(3.14159265358979323846264338327950288419716939937510)
#define gf_PIhalf  f32(3.14159265358979323846264338327950288419716939937510 * 0.5)

Это означает, что половинное значение PI вычисляется каждый раз, когда я использую gf_PIhalf в своем коде, верно?
Не лучше ли вместо этого буквально записать половинное значение PI?

Не лучше ли было бы сделать следующее:

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510)
const float gf_PIHalf = gf_PI * 0.5f;    // PIHalf is calculated once

Наконец, не лучше ли было бы сделать это так (и почему это не кажется обычной практикой):

const float gf_PI = 3.14159265358979323846264338327950288419716939937510;
const float gf_PIHalf = gf_PI * 0.5f;

  • Вас действительно волнует, делает ли ваша программа еще одно умножение? неужели это так критично? 01.03.2013
  • Это большой вопрос. Однажды я задал аналогичный вопрос об ограничениях памяти и эффективности, и я думаю, что стандартный ответ, который я получил, был похож на «Честно говоря, с такой скоростью это не имеет значения». Это такой небольшой объем данных, что коэффициент эффективности не сильно влияет на него. Я думаю, в этом случае Вы обнаружите, что эффективность программы не обязательно страдает от VS. идея, что вы получаете перерасчет, которому вы можете доверять каждый раз. Если вы уверены в арифметике, я бы выбрал чистую эффективность. 01.03.2013
  • Видите ли, хороший компилятор оптимизирует даже такой полный беспорядок в одну константу... 01.03.2013
  • @Smash: Ну, это вряд ли станет узким местом, но если операция умножения действительно будет выполняться каждый раз и будет использоваться в критическом цикле, вызываемом очень часто, то я не вижу причин, почему бы не убедиться, что это не так. не происходит при использовании одного из других решений. 01.03.2013
  • @plast1K: Это константа. Каждый раз пересчитывая его, я больше ему не доверяю. 01.03.2013

Ответы:


1

Это означает, что половина значения PI вычисляется каждый раз, когда я использую gf_PIhalf в своем коде, верно?

Нет, вряд ли.

Вы можете разумно рассчитывать на то, что ваш компилятор будет выполнять это умножение во время компиляции, а не во время выполнения.

28.02.2013

2

Ваши выводы в чем-то верны, за исключением того, что версия #define почти наверняка разрешится во время компиляции, а часть о типах const globals является необычной практикой. Это обычная практика в современном хорошем коде. #define почти мертвы для такого использования. лучшей практикой является определение глобальных переменных области файлов в безымянном пространстве имен:

namespace
{
    const float g_SomeGlobal = 123.456f;
}

Это не позволяет никому за пределами вашей единицы перевода «видеть» g_SomeGlobal.

28.02.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..