Как реализовать MOD для типа плавающей запятой, который является точным, даже если данное значение чрезвычайно большое?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализовать MOD для типа плавающей запятой, который является точным, даже если данное значение чрезвычайно большое?

Сообщение Anonymous »

Это касается реализации вопроса, поэтому, пожалуйста, не упоминайте «Использовать FMOD» или некоторые другие библиотеки. Я пробовал 1) усечение с использованием литья типа, 2) повторяющуюся подраздел и 3) повторяющееся вычитание множеством 2π. < /P>

усечение с использованием литья типа < /li>
< /ol>
inline double Normalize(const double Radian)
{
const double Quotient = Radian * InvTwoPi;
return (Quotient - static_cast(static_cast(Quotient))) * TwoPi;
}

double d = Normalize(12345678912345678.0); // 4.7123889803846897 ≒ 0.75 * 2π
< /code>
В этом случае Radian * Invtwopi не имеет цифры ниже плавающей запятой, когда аргумент больше, чем значения, такие как n 10^17. Таким образом, именно он работает только для аргументов в диапазоне 0 ≤ θ = TwoPi) NormalizedRadian -= TwoPi;
return NormalizedRadian;
}

double d = Normalize(1.23456789123456780e308); // Infinite loop
< /code>
В этом случае вычитание дает одинаковое значение и попадает в бесконечный цикл, когда 2π относительно слишком мал по сравнению с аргументом или когда аргумент слишком велик. < /p>

Повторяющая выявление множества 2π < /li>
< /ol>
inline double Normalize(const double Radian)
{
double NormalizedRadian = Radian;
double MultipleOf2Pi = TwoPi * 10e306;
while (NormalizedRadian >= TwoPi)
{
if (NormalizedRadian >= MultipleOf2Pi) NormalizedRadian -= MultipleOf2Pi;
else MultipleOf2Pi *= 0.1;
}
return NormalizedRadian;
}

double d = Normalize(1.23456789123456780e308); // 2.2069802072571791
< /code>
В этом случае он охватывает все диапазон двойного, включая чрезвычайно большие значения. Однако результат не кажется точным. Например, 1.23456789123456780E308 возврат 2.2069802072571791. FMOD возвращает 1.5619028692308561. Полный точный калькулятор возвращает -0,39872962922519680831536647468742414070004773. < /P>
※ Условия проверки, такие как NAN или Infe, то есть. большой?

Подробнее здесь: https://stackoverflow.com/questions/797 ... given-valu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»