Как убедиться, что размер с плавающей запятой одинаков для разных платформ? - PullRequest
1 голос
/ 25 сентября 2011

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

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

Ответы [ 2 ]

4 голосов
/ 25 сентября 2011

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

См. , как я могу извлечь мантиссу двойного для объяснения AProgrammer функции frexp(), которая разложит число с плавающей точкой на его (целочисленный) показатель степени и (двойной) мантиссу. Комментарии, следующие за этим ответом, объяснят, как преобразовать мантиссу в целое число.

Вы можете сохранить целочисленную мантиссу и показатель степени, которые будут иметь фиксированную длину. Затем вы можете прочитать их обратно и использовать функцию ldexp() для воссоздания исходного плавающего числа (с небольшой ошибкой, конечно).

3 голосов
/ 25 сентября 2011

Вы не можете сделать это переносимо в C;вы должны принять то, что предоставляют системы.

При этом во всех известных мне системах sizeof(float) == 4 и sizeof(double) == 8, но полагаться на это абсолютно опасно.хранить одно и то же значение по-разному.Они могут использовать разные форматы с плавающей запятой или все они используют IEEE 754. Даже если они все используют IEEE 754, они могут хранить их в порядке с прямым порядком байтов или порядком байтов.думаю, что они все должны быть одинакового размера.Скорее всего, вы пытаетесь сделать некоторые необоснованные сокращения в передаче информации между различными машинами.Не берите короткие пути;они приведут вас к проблемам в какой-то момент.Если вы чувствуете, что должны, вы должны оценить, каковы ваши цели переносимости, и проверить, можете ли вы соответствовать им с помощью предлагаемого вами дизайна.Но будь очень осторожен!

...