Длинное целое и плавание

Если Длинное целое и плавание оба берут 4 байта для хранения в памяти затем, почему их диапазоны отличаются?

5
задан Prasoon Saurav 28 January 2010 в 12:20
поделиться

9 ответов

Попробуйте:

function truncate($string, $chars = 50, $terminator = ' …') {
    $cutPos = $chars - mb_strlen($terminator);
    $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' ');
    return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator;
}

Но вы должны убедиться, что ваша внутренняя кодировка правильно установлена.

-121--3978022-

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

1
ответ дан 18 December 2019 в 13:14
поделиться

целые числа хранятся так:

  • 1 бит для знака (+/-)
  • 31 бита для значения.

Поплавки хранятся по-разному, обеспечивая больший диапазон за счет точности:

  • 1 бит для знака (+/-)
  • N битов для Mнтиссе S
  • M битов для показателя E

FLOAT представлен в экспоненциальной форме: (+/-) S * (база) ^ E

, кстати, «длинные» не всегда 32 бита. См. Эта статья .

12
ответ дан 18 December 2019 в 13:14
поделиться

Различный способ кодировать ваши номера.

Длинные подсчитываются от 1 до 2 ^ (4 * 8).

FLOAT использует только 23 из 32 битов для «подсчета». Но добавляет «диапазон» с экспонатом в других битах. Таким образом, у вас есть больше числа, но они менее точны (в нижних частях):

1.2424 * 10 ^ 54 (показатель Mantisse *], безусловно, больше 2 ^ 32. Но вы можете различить длину 2 ^ 31 с длинного 2 ^ 31-1, тогда как вы не можете различить поплавок 1.24 * 10 ^ 54 и поплавок 1.24 * 10 ^ 54 - 1: 1 просто теряется в этом представлении как плавать.

2
ответ дан 18 December 2019 в 13:14
поделиться

Это можно объяснить с точки зрения того, почему представление с плавающей точкой может представлять более широкий диапазон чисел, чем представление фиксированного точка. Этот текст из входа Wikipedia :

Преимущество плавающей точки представление на фиксированной точке (и Целое число) Представительство состоит в том, что он может Поддержите гораздо более широкий диапазон значений. Например, фиксированная точка представление, которое имеет семь десятичных цифры, с десятичной точкой быть расположенным после пятого цифра, может представлять числа 12345.67, 8765,43, 123.00 и так далее, тогда как плавающая точка представление (например, IEEE 754 формат penimal32) с семью десятичными цифры могут дополнительно представлять 1.234567, 123456.7, 0,00001234567, 1234567000000000 и так далее. То Формат с плавающей точкой нужно слегка Больше хранения (чтобы кодировать положение из точки Radix), поэтому при хранении в одно и то же пространство, количества плавающих точек достичь их большего диапазона на затраты точности.

0
ответ дан 18 December 2019 в 13:14
поделиться

. По-разному.

В зависимости от знаний о вашей (и вашей команде) (I.e. XPath не будет эффективным, никто не знает XPath, но все знают Linq к XML). Также некоторые операции могут быть проще в одном или иной.

-121--4904034-

Их диапазоны различны, потому что они используют различные способы представления чисел.

Долгое (в C) эквивалентно длинному INT . Размер этого типа варьируется между процессорами и компиляторами, но часто, как вы говорите, 32 бита. На 32 битах он может представлять 2 32 Разные значения. Поскольку мы часто хотим использовать негативные числа, компьютеры обычно представляют целые числа, используя формат, называемый « ». Таким образом, мы можем представлять номера (-2 31 и до (2 31 -1). Подсчет числа 0, это добавляет до 2 32 номеров.

FLOAT (в C) обычно является единым иссечением IEEE 754 отформатированное число. При 32 битах этот тип данных также может принимать 2 32 различных битовых шаблонов, но они не используются для непосредственного представления целых чисел, как в длинном . Вместо этого они представляют знак, и мантис и экспонент нормализованного десятичного числа.

0
ответ дан 18 December 2019 в 13:14
поделиться

Действительно, поплавок занимает 4 байта (32бита), но так как это поплавок Вы должны хранить разные вещи в этих 32 битах:

  • 1 бит используется для знака (+/-)
  • 8 битов, используемых для показателей
  • 23 битов, используются для значимых (значимых цифр )

Вы можете видеть, что диапазон float напрямую зависит от количества битов, выделенных до значимости, и значения min / max зависят от озвученных битов, выделенных для показателя.

С верхним примером:

  • 8 бит для экспонента (= размер символа) дает показатель [-128,127] -> Макс - около 127 * log10 (2) = 10 ^ 38

, касающихся длинного целого числа, у вас есть 1 бит, используемый для знака, а затем 31 бит, чтобы представлять целочисленное значение, ведущее к максимуму 2 147 483 647.

Вы можете посмотреть на Википедию на более точную информацию: Википедия - Плавающая точка

0
ответ дан 18 December 2019 в 13:14
поделиться

На ручном вагонном высоком уровне, плавающая точка SACREFICES Integer Precision для расширения его диапазона. Это делается путем объединения базового значения с помощью коэффициента масштабирования. Для больших ценностей поплавок не сможет точно представлять все целые числа, но для небольших значений он будет представлять лучшее, чем целочисленная точность.

0
ответ дан 18 December 2019 в 13:14
поделиться

В целом: когда у вас есть больше ценностей (поплавок до 10 ^ Многие), у вас меньше точности.

Это то, что происходит здесь. Если вам нужны целые числа, 32-разрядные дадут вам больше.

0
ответ дан 18 December 2019 в 13:14
поделиться

Нет, размер примитивных типов данных в C является реализацией.

Это вход Wiki четко говорит: формат с плавающей точкой требует немного больше хранения (чтобы кодировать положение точки Radix), поэтому при сохранении в одном и том же пространстве номера с плавающей точкой достигают их больше диапазон за счет точности.

-1
ответ дан 18 December 2019 в 13:14
поделиться