Числа с плавающей запятой фиксированной ширины в C/C++

HTML и CSS не так хороши в выполнении такого рода вещи с высотами. Они определенно больше о прокрутке вертикально через свободно плавную страницу. Я думаю, что JavaScript, вероятно, будет Вашей большей частью полного решения, как заявляет FryGuy.

21
задан mskfisher 10 May 2012 в 12:36
поделиться

6 ответов

Согласно действующему проекту стандарта C99 , приложение F, он должен быть двойным. Конечно, это предполагает, что ваши компиляторы соответствуют этой части стандарта.

Для C ++ я проверил черновик 0x и черновик стандарта 1998 года, но, похоже, ни один из них не указывает ничего о представлении, подобном этой части стандарта C99, кроме логического значения в numeric_limits, которое указывает, что IEEE 754 На этой платформе используется / IEC 559, как упоминает Джош Келли.

Очень немногие платформы не поддерживают IEEE 754, однако, как правило, разработка другого формата с плавающей запятой не окупается, поскольку IEEE 754 четко определен и работает довольно красиво - и если это поддерживается, то разумно предположить, что double действительно 64 бита (в конце концов, IEEE 754-1985 называет этот формат двойной точностью, так что это имеет смысл).

На случай, если double не является двойной точностью, добавьте проверку работоспособности, чтобы пользователи могли сообщать об этом, и вы могли обрабатывать эту платформу отдельно. Если платформа не поддерживает IEEE 754, вы все равно не получите этого представления, если не реализуете его самостоятельно.

3
ответ дан 29 November 2019 в 22:15
поделиться

Хотя я не знаю типа, который гарантирует определенный размер и формат, у вас есть несколько вариантов в C ++. Вы можете использовать заголовок и его шаблон класса std :: numeric_limits , чтобы узнать размер данного типа, std :: numeric_limits :: digits сообщает вам количество бит в мантиссе, а std :: numeric_limits :: is_iec559 должен сказать вам, соответствует ли тип формату IEEE. (Пример кода, который управляет числами IEEE на битовом уровне, см. В шаблоне класса FloatingPoint в файле Google Test gtest-internal.h .)

4
ответ дан 29 November 2019 в 22:15
поделиться

Другой проблемой является представление чисел с плавающей запятой. Обычно это зависит от оборудования, на котором вы работаете (но не всегда). В большинстве систем используются стандарты IEEE 754 с плавающей запятой, но в других также могут быть свои собственные стандарты (например, компьютер VAX).

Описание IEEE 754 в Википедии http://en.wikipedia.org/ wiki / IEEE_754-2008

1
ответ дан 29 November 2019 в 22:15
поделиться

Насколько мне известно, нет никаких вариаций в float / double. Float всегда был 32-битным, а double - 64. Семантика с плавающей запятой довольно сложна, но в

#include <limits>

есть константы. Boost.numeric.bounds - более простой интерфейс, если вам не нужно все в std :: numeric_limits

1
ответ дан 29 November 2019 в 22:15
поделиться

К сожалению, это тоже не гарантируется. Вы должны проверить numeric_limits в .

Но опять же, я никогда не слышал о реализации, в которой double не было бы длиной 64 бита. Если бы вы хотели просто предположить, вам, вероятно, это сойдет с рук.

0
ответ дан 29 November 2019 в 22:15
поделиться

Одна из самых больших проблем с такими «типами фиксированной ширины» состоит в том, что их очень легко ошибиться. Вероятно, вам не нужно 32-битное целое число. В чем смысл? То, что вы хотели, - это целочисленный тип, который может хранить как минимум 1 >> 31. Это длинный int . Для этого вам даже не нужен .

Точно так же ваш язык сценариев может реализовать тип FP, который будет работать до тех пор, пока базовый C ++ float будет не менее 32 бита. Обратите внимание, что это все еще не дает вам точного поведения. Я почти уверен, что C ++ не гарантирует -1.0 / -3.0 == 1.0 / 3.0

-4
ответ дан 29 November 2019 в 22:15
поделиться