Стандартные гарантии использования арифметики с плавающей запятой для представления целочисленных операций

Я работаю над кодом, который будет работать на очень разнородном кластере. Программа выполняет интервальную арифметику с использованием 3, 4 или 5 32-битных слов (беззнаковых целых), чтобы представить границы высокой точности для интервалов. Мне кажется, что представление некоторых слов в плавающей запятой в некоторых ситуациях может привести к ускорению. Итак, мой вопрос состоит из двух частей:

1) Существуют ли какие-либо гарантии в стандарте C11 относительно того, какой диапазон целых чисел будет представлен в точности, и в каком диапазоне входных пар будут точно представлены их произведения? Одна ошибка умножения может полностью изменить результаты.

2) Это даже разумный подход? Кажется, что разделение обработки с плавающей запятой и целочисленной обработки в процессоре позволило бы данным проходить по обоим конвейерам одновременно, улучшая пропускную способность. Хотя я не очень разбираюсь в оборудовании, поэтому я не уверен, что конвейеры для целых чисел и чисел с плавающей запятой на самом деле совершенно разные, или, если они есть, могут ли они использоваться одновременно.

Я понимаю, что эффективность такого рода вещей зависит от платформы, но сейчас я обеспокоен надежностью этого подхода. Если это надежно, я могу сравнить его и посмотреть, но у меня возникают проблемы с доказательством надежности. Во-вторых, возможно, такой подход мало обещает, и если это так, я хотел бы знать, чтобы я мог сосредоточиться в другом месте.

Спасибо!

2 ответа

Решение

Все, что вам нужно знать, до каких пределов вы можете идти и при этом иметь целочисленную точность, должно быть доступно вам через макросы, определенные в <float.h>, Там у вас есть точное описание типов с плавающей точкой, FLT_RADIX для корня, FLT_MANT_DIG для количества цифр и т. д.

Как вы говорите, будет ли такой подход эффективным или нет, будет зависеть от платформы. Вы должны знать, что это сильно зависит от конкретного процессора, а не только от семейства процессоров. От одного варианта процессора Intel или AMD к другому уже могут быть существенные различия. Таким образом, вы будете в основном тестировать все возможности и иметь код, который решает при запуске программы, какой вариант использовать.

Я не знаю о Стандарте, но кажется, что вы можете предположить, что все ваши процессоры используют обычный формат IEEE с плавающей запятой. В этом случае довольно легко определить, правильны ли ваши расчеты. Первое целое число, не представляемое 32-разрядным float формат 16777217 (224+1), поэтому, если все ваши промежуточные результаты меньше (в абсолютном значении), float будет хорошо.

Обратное также верно: если какой-либо промежуточный результат больше 224 (в абсолютном значении) и нечетный, float Представление изменит его, что для вас неприемлемо.

Если вас беспокоит именно умножение, посмотрите, как ограничены умножения. Если один ограничен 211, а другой 213, у вас все будет хорошо (только с трудом). Если, например, оба ограничены 216, почти наверняка есть проблема. Чтобы доказать это, найдите тестовый пример, который приводит к тому, что их продукт будет превышать 224 и будет странным.

Другие вопросы по тегам