Связанные с диапазонами типов данных [duplicate]

Конфигурация PHP

2 записи в php.ini диктуют вывод ошибок:

  1. display_errors
  2. error_reporting

В процессе производства display_errors обычно устанавливается на Off (что хорошо, потому что отображение ошибок на производственных площадках обычно нежелательно!).

Однако в разработке он должен быть установлен на On, чтобы отображались ошибки. Check!

error_reporting (начиная с PHP 5.3) устанавливается по умолчанию на E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED (что означает, что все отображается за исключением уведомлений, строгих стандартов и уведомлений об отказе). Если вы сомневаетесь, установите его на E_ALL, чтобы отобразить все ошибки. Проверьте!

Whoa whoa! Нет проверки! Я не могу изменить свой php.ini!

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

Конфигурация времени выполнения

В желаемом скрипте мы можем изменить записи php.ini во время выполнения! Значит, он будет запускаться при запуске скрипта! Sweet!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Эти две строки будут делать тот же эффект, что и изменение записей php.ini, как указано выше!

Я все еще получаю чистую ошибку страницы / 500!

Это означает, что сценарий даже не запускался! Это обычно происходит, когда у вас есть синтаксическая ошибка!

С синтаксическими ошибками скрипт даже не доходит до времени выполнения. Он не работает во время компиляции, то есть он будет использовать значения в php.ini, которые, если вы не изменились, могут не разрешать отображение ошибок.

Журналы ошибок

Кроме того, PHP по умолчанию регистрирует ошибки. На общем хостинге это может быть в выделенной папке или в той же папке, что и скрипт-нарушитель.

Если у вас есть доступ к php.ini, вы можете найти его под error_log .

31
задан Lundin 10 October 2013 в 11:01
поделиться

2 ответа

  • float сохраняет значения с плавающей запятой, то есть значения, которые имеют потенциальные десятичные места
  • int, сохраняют только целые значения, т. е. целые числа

Таким образом, хотя оба они имеют ширину в 32 бита, их использование (и представление) совершенно иное. Вы не можете хранить 3.141 в целых числах, но вы можете в float.

Рассеивать их еще немного:

В целые числа все биты используются для хранения значения числа. Это (на Java и многие компьютеры) сделано в так называемом дополнении two . Это в основном означает, что вы можете представлять значения & minus; 231 to 231 & nbsp; & minus; & nbsp; 1.

В поплавке эти 32 бита разделяются между тремя отдельными частями: знаковый бит, показатель экспоненты и мантисса. Они выложены следующим образом:

S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM

Существует один бит, который определяет, является ли число отрицательным или неотрицательным (ноль не является ни положительным, ни отрицательным, но имеет битовый знак, установленный в ноль) , Тогда есть восемь бит экспонента и 23 бит мантиссы. Для получения полезного номера из этого (примерно) выполняется следующий расчет:

M × 2 E

< / blockquote>

(Этого больше, но этого должно хватить для цели этого обсуждения)

Мантисса по существу не намного больше, чем 24-битное целое число. Это умножается на 2 на степень экспоненциальной части, которая, грубо говоря, представляет собой число между & минус 128 и 127.

Поэтому вы можете точно представлять все числа, которые будут вписываться в 24-битное целое число но числовой диапазон также намного больше, поскольку более крупные экспоненты допускают большие значения. Например, максимальное значение для параметра float составляет около 3,4 × 1038, тогда как int допускает только значения до 2,1 × 109.

Но это также означает, поскольку 32 бита имеют только 4,2 × 109 разных состояния (которые все используются для представления значений int могут сохраняться), что на большем конце числового диапазона float номера разнесены на более широкие расстояния (поскольку не может быть более уникальных float чисел, чем есть уникальные номера int). Вы не можете точно представлять некоторые цифры. Например, число 2 × 1012 имеет представление в float из 1 999 999 991 808. Это может быть закрыть до 2 000 000 000 000, но это не точно. Аналогично, добавление 1 к этому числу не меняет его, потому что 1 слишком мал, чтобы изменить разницу в больших масштабах float.

Аналогичным образом вы также можете представлять очень маленькие числа (между 0 и 1) в float, но независимо от того, являются ли цифры очень большими или очень маленькими, float имеет точность приблизительно 6 или 7 десятичных цифр. Если у вас есть большие числа, эти цифры находятся в начале номера (например, 4.51534 × 1035, что составляет не более 451534, после 30 нулей - и float не может ничего сказать о том, действительно ли эти 30 цифр являются нулями или чем-то еще ), для очень малых чисел (например, 3.14159 × 10 и минус 27) они находятся в дальнем конце номера, за пределами начальных цифр 0,0000 ...

77
ответ дан Joey 21 August 2018 в 00:51
поделиться
  • 1
    Стоит отметить, что, хотя два типа данных имеют одинаковый размер (32-разрядный), бит-шаблон, используемый для представления одного и того же числа в двух типах данных, значительно отличается. Например. битовый шаблон для целых чисел без знака 1 равен 00 .... 001, тогда как бит-шаблон для с плавающей запятой 1.0 будет совсем другим. – Sasha Goldshtein 26 January 2011 в 17:23
  • 2
    @ Саша: все еще печатать;) – Joey 26 January 2011 в 17:25
  • 3
    Тонкая точка состоит в том, что числа с плавающей запятой фактически не поддерживают десятичные знаки. Вместо десятичной точки у них есть точка счисления. Во всех практических случаях радикс равен 2. (Десятичные поплавки стандартизованы IEEE, но не используются в широком смысле.) Это различие может быть важным, особенно в приложениях, чувствительных к округлению, например, в финансовых приложениях. – Kevin A. Naudé 26 January 2011 в 18:03
  • 4
    @ Кевин: Действительно. Я сохранил этот ответ очень мелким, хотя, поскольку я думаю, что если кто-то даже не знает разницы между FP и интегральными типами, есть много объяснений, которые еще предстоит сделать. Но да, вы почти никогда не хотите, чтобы числа с плавающей запятой приближались к денежным значениям. – Joey 26 January 2011 в 18:21
  • 5
    @Ammaro: у мантиссы подразумевается первый бит 1. Это означает, что на самом деле это 24 бита, хотя в структуре данных содержится всего 23. – Joey 26 January 2015 в 14:57

Поплавки используются для хранения более широкого диапазона чисел, чем может быть помещено в целое число. К ним относятся десятичные числа и номера стилей научной нотации, которые могут быть более значительными, чем могут соответствовать 32 битам. Вот глубокое погружение в них: http://en.wikipedia.org/wiki/Floating_point

2
ответ дан Mark Dickinson 21 August 2018 в 00:51
поделиться
  • 1
    Строго говоря, вы должны сказать 32 бита ... 2 ^ 32 - это число значений, которое может быть представлено 32 битами. 2 ^ 32 бита будут ~ 4 гигабита (или 4 gibibits) ... и вы можете с уверенностью представить более крупные значения с помощью, чем вы можете с помощью одного поплавка точности. – Luke 20 June 2013 в 15:25
Другие вопросы по тегам:

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