2009-07-19 8 views
0

Сколько различных чисел составляет от 1,5 x 10 -45 до 3,4 x 10 (IEE754 одинарные прецизионные поплавки)?Сколько различных чисел от 1,5 х 10^(- 45) до 3,4 х 10^38?

+2

Что вы подразумеваете под разными цифрами? Ваш вопрос о представлениях чисел с плавающей запятой на компьютере? Кроме того, я предполагаю, что вы хотели написать 3.4 x 10^38. –

+2

Существует бесконечное число различных чисел между любыми двумя числами. Вы должны уточнить свой вопрос. – Nifle

+2

Если вы имеете в виду действительные числа, то бесконечный ответ. Также, если вы говорите о рациональных или иррациональных числах. Также бесконечно. Но если вы имеете в виду целые числа, тогда проверьте мой ответ ниже. –

ответ

23

Предполагая, что вы говорите о диапазоне в IEEE одинарной точности поплавка (1,5 х 10^-45 является наималейшего положительного значения он может представлять, что он может представлять и 3,4 х 10^38 наибольшее положительное значение)

мы имели бы следующие возможные макеты для 4-х байт это число будет занимать:

0 00000000 00000000000000000000000 = 0 
0 00000000 00000000000000000000001 = 1.5 x 10^-45 
...... 
0 11111110 11111111111111111111111 = 3.4 x 10^38 
0 11111111 00000000000000000000000 = Infinity 
0 11111111 xxxxxxxxxxxxxxxxxxxxxxx = NaNs 

Который должен дать нам 2139095037 номера между ними двумя.

+0

Вероятно, вы также должны исключить кучу NaN. – avakar

+0

Правильно, я забыл об экспоненциальном экспоненте == 255 в первом ответе. Благодаря! –

+0

Это лучше, +1. – paxdiablo

0

Это не программирование.

Ьс говорит (для целых чисел):

1.5*10^45 
1500000000000000000000000000000000000000000000.0 
3.4*10^38 
340000000000000000000000000000000000000.0 
1500000000000000000000000000000000000000000000.0-340000000000000000000000000000000000000.0 
1499999660000000000000000000000000000000000000.0 
+0

Вопрос был отредактирован, чтобы исправить одну ошибку, а другая была введена. Нижний предел диапазона составляет 1,5 x 10^-45, который не является целым числом. Это видно из названия вопроса. –

+1

Отмечено. В этом случае ваш ответ правильный - между ними существует бесконечное количество чисел. Но это все еще похоже на вопрос о домашнем задании. Почему мы снова отвечаем? – Chaos

0

Я думаю, что вы имеете в виду целые числа. А также вы имеете в виду между 3.4 * 10^38 и 1.5 * 10^45, потому что 1.5 * 10^45 больше, чем другое. В любом случае ответ такой же, как и с меньшими числами. Я предполагаю, что вы хотите исключить эти два числа:

Сколько номеров существует между 2 и 10? Ответ 10-2-1 = 7. Действительно, 3,4,5,6,7,8,9 - 7 номеров. Таким образом, «формула»:

Сколько цифр между a и b? Ответ ба-1

Так 1,5 * 10^45-3.4 * 10^38 -1 = 15 * 10^44-34 * 10^37 -1 = (15 * 10^7) * 10^37-34 * 10^37 -1 = (15 * 10^7-34) * 10^37 -1 = (150000000-34) * 10^37 -1 = 149999966 * 10^37 -1 или 1499999659999999999999999999999999999999999999

4

Я пытаюсь догадаться, о чем идет речь. 1.4E-45 - это приблизительно наименьшее число (иногда называемое epsilon), которое может быть представлено в сингле IEEE 754. Наибольшее число составляет примерно 3.4E38. Один находится на компьютере, хранящемся в 32-битном значении, и один бит, используемый для знака. Это дает 31 бит для представления чисел от epsilon до максимального значения. Если мы предположим, что все возможные 31-битные числа приводят к действительному синглу, тогда ответ на ваш вопрос равен 2^31 или 2 147 483 648. Как было указано, это предположение неверно, поскольку некоторые значения равны Не номер или NaN.

Вы можете прочитать больше о чисел с плавающей точкой на Wikipedia

+0

Ваше предположение неверно, не каждое 32-битное значение доступно для представления числа. – paxdiablo

+0

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

6

Конечно, это может быть сделано programmaticaly, для любых двух чисел с плавающей точкой в ​​целом. «Лексикографический индекс» - это упорядоченный индекс числа с плавающей точкой, доступный, среди прочего, потому что IEEE 754 был разработан таким образом, чтобы его было легко производить.

Основное правило: для любых двух поплавков, если (float1 > float2), то (lexIndex1 > lexIndex2).

Так вычисляя число IEEE 754 чисел между является вопросом вычитания лексикографических индексов двух чисел:

public class FloatUtil 
{ 
    public static uint ToLexicographicIndex(float value) 
    { 
     //transfer bits to an int variable 
     int signed32 = BitConverter.ToInt32(BitConverter.GetBytes(value), 0); 
     uint unsigned32 = (uint)signed32; 

     //(0x80000000 - unsigned32) returns 
     //appropriate index for negative numbers 
     return (signed32 >= 0) 
        ? unsigned32 
        : 0x80000000 - unsigned32; 
    } 

    public static uint NumbersBetween(float value1, float value2) 
    { 
     if (float.IsNaN(value1) || float.IsInfinity(value1)) 
     { 
      throw new ArgumentException("value1"); 
     } 

     if (float.IsNaN(value2) || float.IsInfinity(value2)) 
     { 
      throw new ArgumentException("value2"); 
     } 

     uint li1 = ToLexicographicIndex(value1); 
     uint li2 = ToLexicographicIndex(value2); 

     //make sure return is positive 
     return value1 >= value2 ? li1 - li2 : li2 - li1; 
    } 
} 

И, конечно же, использование в этом случае:

uint result = FloatUtil.NumbersBetween(1.5e-45f, 3.4e+38f); 

В в этом случае результат равен 2139081117 для этих чисел в C#, так как константное выражение 3.4e+38f не скомпилируется в максимум диапазона поплавка. Однако, используя float.MaxValue (3.40282347E+38), поскольку второе число дает нам ожидаемое число, 2139095038.

+1

Это ответ на вопрос, который должен был быть –

+0

Право, когда я хотел добавить его в первый раз, вопрос был закрыт :) –

+0

, если мы применим логику вашего кода к целым числам, 4 и 2 имеют (4-2) = два числа между ними. Поэтому из-за этой ошибки ваш ответ на один больше, чем правильный. –