Большинство целых чисел не являются числами с плавающей точкой ( johndcook.com )
Это должно быть очевидно. Существует столько же 32-битных целых чисел, сколько и 32-битных чисел с плавающей точкой [0], поэтому для каждого числа с плавающей точкой, которое не является целым числом, существует целое число, которое не является числом с плавающей точкой. Очевидно, что большинство чисел с плавающей точкой не могут быть представлены как целые числа, поэтому обратное также должно быть верным.
Но я все еще вижу людей, создающих системы, в которых неявное преобразование float в int не допускается, поскольку «это приведет к потере точности», но которые позволяют преобразованию int в float.
[0] не отвечайте мне по поводу NaN, пожалуйста
Конечно, но по крайней мере по моему опыту редко приходится преобразовывать 32-битные int в 32-битные float. Обычно преобразование происходит из 32-битного int в 64-битные float, что всегда безопасно.
> Это должно быть очевидно
Да
Они бывают разных типов
Это разные вещи.
Это связанные понятия, вот и все.
Жаль, что мы склонны учить числа с плавающей точкой как компьютерную версию действительных чисел. Думать о них как о “научных числах” действительно очень помогает в этом.
Я хочу сделать футболку в стиле «Птицы не настоящие»[0] с надписью «Поплавки не настоящие».
[0]: https://en.wikipedia.org/wiki/Birds_Aren%27t_Real
Это верно, но нам также следует быть осторожными, обучая int как компьютерной версии целых чисел.
… но люди привыкли использовать doubles. Многие языки, такие как Javascript, поддерживают только doubles, а int32(s) встраиваются в doubles.
У меня есть некоторые заметки о фантастическом компьютере, который, возможно, появился бы, если бы китайцы [1] разработали что-то вроде PDP-10 [2]. Изначально я хотел 24-битный размер слова [3], но решил остановиться на 48-битном [4], потому что 48 бит можно уместить в double для реализации Javascript.
[1] Существуют инструкции по сканированию символов UTF-8, а система отображения поддерживает растровые символы двойной ширины, которые разделены на половины, индексированные 24-битными целыми числами.
[2] Это архитектура загрузки-хранения, но есть инструкции для извлечения и записи 0
[4] В предыстории, он начинался с 24-битного адресного пространства, как 360, но был расширен, чтобы иметь “широкие указатели”, квалифицированные идентификатором адресного пространства (вместо ориентированной на страницы архитектуры, которую индустрия действительно приняла), а также “глубокие указатели”, которые определяют битовую карту, 48 бит достаточно, чтобы указатель был глубоким и широким и имел несколько битов тега. Адресные пространства могут объединяться вместе смежно или нет, в зависимости от того, что вы помещаете в таблицу адресных пространств.
Source: news.ycombinator.com