C ++ - Безопасно ли писать и читать float как двоичные файлы на x86 и IEEE-754 [duplicate]

Разница в операторах присваивания понятна, когда вы используете их для установки значения аргумента в вызове функции. Например:

median(x = 1:10)
x   
## Error: object 'x' not found

В этом случае x объявляется в пределах области действия функции, поэтому он не существует в рабочей области пользователя.

median(x <- 1:10)
x    
## [1]  1  2  3  4  5  6  7  8  9 10

В этот случай, x объявлен в рабочей области пользователя, поэтому вы можете использовать его после завершения вызова функции.


В сообществе R есть общий способ использования <- для назначения (кроме сигнатур функций) для совместимости с (очень) старыми версиями S-Plus. Обратите внимание, что пробелы помогают прояснить ситуации, такие как

x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3

. Большинство R IDE имеют быстрые клавиши, чтобы сделать <- проще для ввода. Ctrl + = в архитекторе, Alt + - в RStudio (Option + - под macOS), Shift + - (подчеркивание) в emacs + ESS.


Если вы предпочитаете писать = на <-, но вы хотите использовать более общий символ назначения для общедоступного кода (например, на CRAN), то вы можете использовать одну из функций tidy_* в пакете formatR для автоматической замены = с <-.

library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5

Ответ на вопрос «Почему x <- y = 5 выдает ошибку, но не x <- y <- 5?» «Это зависит от магии, содержащейся в парсере». Синтаксис R содержит много неоднозначных случаев , которые должны быть решены так или иначе. Парсер решает разрешить биты выражения в разных порядках в зависимости от того, использовались ли = или <-.

Чтобы понять, что происходит, вам нужно знать, что назначение тихо возвращает значение, которое был назначен. Вы можете увидеть это более четко, явно напечатав, например, print(x <- 2 + 3).

Во-вторых, это яснее, если мы используем префиксную нотацию для назначения. Итак,

x <- 5
`<-`(x, 5)  #same thing

y = 5
`=`(y, 5)   #also the same thing

Парсер интерпретирует x <- y <- 5 как

`<-`(x, `<-`(y, 5))

. Мы могли бы ожидать, что x <- y = 5 будет

`<-`(x, `=`(y, 5))

, но на самом деле он интерпретируется как

`=`(`<-`(x, y), 5)

Это связано с тем, что = имеет более низкий приоритет, чем <-, как показано на странице справки ?Syntax .

27
задан AstroCB 30 August 2014 в 22:10
поделиться

4 ответа

В отличие от ошибочных Pentiums , любой процессор на базе x86 или x64 использует IEEE 754 в качестве арифметического стандарта с плавающей запятой.

Ниже приведен краткий обзор стандартов FPA и их усыновления.

IEEE 754:       Intel x86, and all RISC systems (IBM Power
                and PowerPC, Compaq/DEC Alpha, HP PA-RISC,
                Motorola 68xxx and 88xxx, SGI (MIPS) R-xxxx,
                Sun SPARC, and others);

VAX:            Compaq/DEC

IBM S/390:      IBM (however, in 1998, IBM added an IEEE 754
                option to S/390)

Cray:           X-MP, Y-MP, C-90; other Cray models have been
                based on Alpha and SPARC processors with
                IEEE-754 arithmetic.

Если вы не планируете поддерживать свою библиотеку на довольно экзотических архитектурах процессора, можно с уверенностью предположить, что на данный момент 99% процессоров совместимы с IEEE 754.

19
ответ дан Sam 4 September 2018 в 07:37
поделиться

SPUs Cell Processor отличаются несколькими способами (например, отсутствие INF и NAN), но я не думаю, что существуют различия, которые нарушат ваши предположения ...

4
ответ дан celion 4 September 2018 в 07:37
поделиться

Процессоры PowerPC (Mac до 2006-2007 гг., тонны текущих серверов IBM) используют 128-битный формат, состоящий из двух удвоений для длинного двойного, вместо этого, если расширенный формат IEEE 754.

Однако в C или Objective-C нет переносимого способа интерпретировать число с плавающей запятой 32-разрядного или 64-битного числа в виде целого числа (предполагается, что float и uint32_t, или double и uint64_t имеют одинаковое количество биты). Когда мне нужно было что-то делать, мне пришлось писать разные коды в зависимости от компилятора (один из них использовал объединение, один - путем двойного перевода длинным *). Не знаю, сделает ли переинтерпретатор на C ++ портативным.

3
ответ дан gnasher729 4 September 2018 в 07:37
поделиться

Это зависит от того, где вы рисуете линию между «реальным миром» и мнимой.

  1. Формат Vax G по-прежнему поддерживается на машинах Alpha (которые HP заявляют, что они будут поддерживать, по крайней мере, до 2013 года).
  2. IBM hexadecimal FP по-прежнему поддерживается универсальными мейнфреймами IBM z-series , Они добавили двоичную и десятичную поддержку IEEE, но из того, что я слышал, они редко используются, потому что шестнадцатеричный FP немного быстрее (IBM оптимизировала его примерно 45 лет ...)

До недавнего времени Unisys по-прежнему продавал ClearPath IX, который поддерживал формат Burroughs FP, и машины ClearPath MCP для поддержки формата Univac FP. Я считаю, что теперь они запускаются только в эмуляции (на Xeons), но с точки зрения программного обеспечения они, вероятно, будут продолжать активно использоваться еще какое-то десятилетие или более.

Есть даже несколько человек с использованием DtCyber ​​ для запуска платных (эмулируемых) мэйнфреймов управляющих данных с их уникальным форматом с плавающей запятой. (Извините, но мое первое серьезное программирование было на CDC Cyber-машине, поэтому я не смог удержаться от него, даже если он не был «реальным миром» на протяжении десятилетий).

11
ответ дан Jerry Coffin 4 September 2018 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: