Как я могу представить вывод 250500 * 250500 в 32-битном слове?

254
Wino Paz

У нас 250500 * 250500 = 62 570 250 000. Как мы можем представить это, используя низкие и высокие? Я знаю, что наибольшее число, которое можно представить в 32 битах, составляет 4 294 967 295 (2 ^ 32 - 1)

-3
-1 этот вопрос «Как мы можем изобразить это [число], используя низкое и высокое», является бредом. И, кстати, цифра, которую вы даете, является наибольшим числом, если не хранить отрицательных чисел. barlop 7 лет назад 1
Возможно, под низким и высоким вы подразумеваете двоичный файл, где низкий равен 0, а высокий равен 1. barlop 7 лет назад 0
Кроме того, число, которое вы пытаетесь сохранить, составляет 62 миллиарда, где вы сказали, что самое большее, что вы можете хранить в 32 битах, это 4 миллиарда. Все, о чем я могу думать, это, возможно, показатель степени и мантисса - двоичная научная запись. barlop 7 лет назад 2
если вы проверите Windows Calculator, вы увидите, что двоичный код для этой 62-миллиардной цифры, которую вы даете, равен `11101001 11000011 01001101 01000001 0000`, что составляет 32 бита + 4 бита на конце, которые являются нулями, поэтому, если вы храните первые 32 бита в одном месте , а в другом месте вы храните что-то, говорящее, умножьте это на 2 ^ 4, тогда эта жвачка сработает. Возможно, это будет показатель степени 4. Но вам все равно понадобятся некоторые биты для показателя. По крайней мере, 3 бита. Вы используете показатель. Я не могу понять, как вы можете хранить это число всего в 32 битах. Может быть, 35 или 36 бит. Возможно, в двух 32-битных словах, если вам позволено barlop 7 лет назад 1
Почему вы искусственно ограничиваете себя только 32-битами? Ramhound 7 лет назад 2
@ barlop: "Я не вижу" ... не только ты. (Я парень, который проголосовал за ваш комментарий.) Твердые математические ограничения диктуют, что вы совершенно правы. «Принцип голубиного отверстия», часто обсуждаемый относительно того, что возможно сжимаемостью данных, отмечает, что есть некоторые ограничения, которые мы не можем просто «обойти» только потому, что воспринимаемый результат кажется хорошим. TOOGAM 7 лет назад 0
@TOOGAM хорошо, я полагаю, что есть некоторая интерпретация даже при регулярном хранении двоичных чисел, например, что это число .. или что число должно быть> = 0, так что можно придумать схему для хранения чисел, которая требует 1 бит. 0 = номер не хранится 1 = его 62 миллиарда независимо от числа! Или схема, которая хранит небольшой диапазон чисел, но диапазон, который включает его. Я просто не вижу, что он говорит о такой схеме, хотя ;-) (но это не пошло бы против «твердой математики», если бы он сделал!) Вот почему я не сказал, что это невозможно. barlop 7 лет назад 0

2 ответа на вопрос

2
TOOGAM

В двоичном виде 250500 * 250500 = 62 570 250 000 выглядит следующим образом:
0011 1101 0010 1000 0100 * 0011 1101 0010 1000 0100 =
0110 1001 1100 0011 0100 1101 0100 0001 0000

Твердые математические правила гласят, что вы можете поместить результаты 18-битного числа, умноженного на 18-битное число, в 36 бит. Твердые правила математики гласят, что вы не можете обязательно уменьшить биты от сжатия, поэтому есть некоторые ограничения, с которыми вам, возможно, придется иметь дело.

Тем не менее, могут быть некоторые варианты.

Компьютер может быть использован для отслеживания метров ... или километров.
Если вы отслеживали концепцию 50 километров, это практически то же самое, что отслеживать 50000 метров.
Аналогично, вместо отслеживания 250500 * 250500 = 62 570 250 000 (то есть 250 500 единичных единиц x 250 500 единичных единиц), вы можете отслеживать десятичные единицы, например, 25050x25050 = 627 502 500 (250 500 дека-единиц x 250 500 дека-единиц = 627 502 500 квадратных дека -единицы). Число 627 502 500 будет соответствовать 32-битному слову.

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

Возможно, вместо отслеживания дека-единиц (которые представляют собой группы из 10 единиц), вы можете отслеживать группы единиц, которые имеют разный размер, например, группы из 500 единиц. Концепция заключается в том, что если вы знаете, что ваши числа всегда будут четными, то вы можете разделить числа на два и, возможно, на меньшие единицы. (Хотя вам нужно поделить более чем на 2, чтобы получить конкретное максимальное значение 4 294 967 295.) Если вы можете отслеживать гекто-единицы (100 единиц каждый), вместо 250 500 * 250 500 у вас будет 2,505 * 2,505 = 6,275,025 (12 битов на 12 битов, для сохранения результата может потребоваться 24 бита, но в данном конкретном случае требуется только 23 бита). Если вы можете отслеживать Quinque гекто единиц (500), вы бы 501 * 501 = 251,001 (9 битов раз 9 битов, хранящихся в 18 бит).

Можно ли найти полезный шаблон - это один из аспектов полезного программирования, который выходит за рамки простого знакомства с языком программирования. Выполнение этого часто зависит от того, какую концепцию в реальном мире вы пытаетесь отслеживать, и выполнимость (и детали реализации) могут варьироваться в зависимости от различных реальных сценариев.

Изменить: Незначительная коррекция. Также расширен параграф около 500 единиц, чтобы показать фактические цифры в качестве демонстрации.

0
TOOGAM

В настоящее время вопрос гласит: «У нас 250500 * 250500 = 62 570 250 000».

Ну, это полная чушь.
250500 * 250500 = 62 570 250 000. (НЕПРАВИЛЬНЫЙ МАТЕМАТИЧЕСКИЙ, указанный в вопросе)
250500 * 250500 = 62 750 250 000. (ПРАВАЯ МАТЕМАТИКА, что вопрос, вероятно, хотел задать)

Это отбрасывало некоторые из моих расчетов. Если мы допустим опечатку и исправим ее, то я могу предоставить этот ответ для 62 750 250 000.

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

25 500 - это 18 бит.
2 один бит.
Это требует всего 19 бит. Это 32 бита. Это работает.

На самом деле, этот способ мышления очень похож на то, как процессор x86 (80387 и новее) отслеживает числа с плавающей запятой, используя некоторые биты в качестве Significand .

В вопросе не указано, что 62 570 250 000 необходимо хранить в виде прямого числа. Первое, что можно сделать, это попытаться получить квадратный корень и посмотреть, является ли результат целым числом. Результатом является целое число, и поэтому доступно совершенно правильное решение. Это решение успешно позволяет хранить некоторые числа размером до 549 755 748 352 (что равно 8 388 607 * 65 536, или 8 388 607 * (два подняты до 16-й степени)). Одно из чисел, которое эта система может точно представить, составляет
62 750 250 500,
хотя эта же система не сможет хранить
62 750 250 499

Это нормально, хотя, потому что вопрос не требует хранения всех возможных меньших чисел. Вопрос просто хотел представить число 62 750 250 500. Это вполне выполнимо.

Итак, биты, которые вы храните:
0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0

Используя технику, аналогичную обычной сборке с плавающей запятой IEEE, эти биты можно интерпретировать как:

  • положительное число (первый бит)
  • 25500 (биты с 10 по 32)
  • который умножается на себя один раз
    • Потому что ... "1" - это значение битов от 2 до 9.

Обратите внимание, что биты со 2 по 8 и с 10 по 14 являются ведущими нулями. Это 7 + 5 = 12 битов, которые не очень эффективны в этом случае. Если положительные числа предполагаются, это 13 битов, которые могут быть немного неэффективными / неэффективными для этого конкретного случая, поэтому может быть вероятность того, что они могут использоваться по-другому. (Помните, ранее я говорил, что нам нужно 19 из 32 битов. 13 + 19 = 32.)

Идея заключается в том, что нет необходимости хранить «выходные данные» в виде большого числа, когда вы знаете, что это число может быть легко представлено как степень двух. Значение 62 750 250 000 фактически сохраняется, и способ, которым это представлено, хранит меньшее число вместе с степенью . По сути, мы храним данные, которые, в сочетании с известной формулой, которую мы указали, позволяют нам хранить это конкретное число. (Эта формула может оказаться полезной для хранения других чисел в ситуации, когда люди часто имеют дело с квадратами.)

Примечание. Эта система в некоторой степени похожа, но НЕ является той же, что и система с плавающей запятой IEEE, о которой я говорил в классе сборки на университетском языке, посвященном сборке x86. Вот гиперссылка на онлайн-конвертер для плавающей запятой IEEEкоторый вы могли бы использовать для этой системы. В этой системе биты для показателя степени указывают, какая степень 2 используется для умножения оставшихся битов. Однако это не соответствует этому случаю, так как 25 500 не является степенью двойки. Пытаясь использовать систему с плавающей запятой IEEE, мы можем обнаружить, что 62 750 250 000, разделенные на 16, составляют 3 921 890 625. Таким образом, мы могли бы представить число как 3 921 890 625 раз (два возведены в четвертую степень). Тем не менее, нам потребуется 36 бит, что больше, чем запрашиваемые 32 бит (и больше, чем 24 бит, которые используются сопроцессорами Intel для хранения неэкспонентной версии числа).

Я мог бы в значительной степени игнорировать «использование низкого и высокого» часть вопроса. Я не очень ясно понял, о чем вопрос. Однако эта система действительно использует разные биты для разных целей, и поэтому часть экспоненты данных может считаться «старшими» битами, чем другие биты, размещенные в более низкой позиции. Таким образом, на вопрос «Как мы можем изобразить это» прямо отвечает смелое предложение и объясняется далее с остальной частью этого ответа.

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