Сколько различных чисел составляет от 1,5 x 10 -45 до 3,4 x 10 (IEE754 одинарные прецизионные поплавки)?Сколько различных чисел от 1,5 х 10^(- 45) до 3,4 х 10^38?
ответ
Предполагая, что вы говорите о диапазоне в 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 номера между ними двумя.
Это не программирование.
Ьс говорит (для целых чисел):
1.5*10^45
1500000000000000000000000000000000000000000000.0
3.4*10^38
340000000000000000000000000000000000000.0
1500000000000000000000000000000000000000000000.0-340000000000000000000000000000000000000.0
1499999660000000000000000000000000000000000000.0
Вопрос был отредактирован, чтобы исправить одну ошибку, а другая была введена. Нижний предел диапазона составляет 1,5 x 10^-45, который не является целым числом. Это видно из названия вопроса. –
Отмечено. В этом случае ваш ответ правильный - между ними существует бесконечное количество чисел. Но это все еще похоже на вопрос о домашнем задании. Почему мы снова отвечаем? – Chaos
Я думаю, что вы имеете в виду целые числа. А также вы имеете в виду между 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
Я пытаюсь догадаться, о чем идет речь. 1.4E-45 - это приблизительно наименьшее число (иногда называемое epsilon), которое может быть представлено в сингле IEEE 754. Наибольшее число составляет примерно 3.4E38. Один находится на компьютере, хранящемся в 32-битном значении, и один бит, используемый для знака. Это дает 31 бит для представления чисел от epsilon до максимального значения. Если мы предположим, что все возможные 31-битные числа приводят к действительному синглу, тогда ответ на ваш вопрос равен 2^31 или 2 147 483 648. Как было указано, это предположение неверно, поскольку некоторые значения равны Не номер или NaN.
Вы можете прочитать больше о чисел с плавающей точкой на Wikipedia
Ваше предположение неверно, не каждое 32-битное значение доступно для представления числа. – paxdiablo
Вы правы, но поскольку вопрос выглядит как простой вопрос о домашнем задании, я пытаюсь найти простой ответ, который не требует подробного описания IEEE 754, а просто понятие использования чисел с плавающей точкой для приближения действительных чисел на компьютере. –
Конечно, это может быть сделано 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
.
Это ответ на вопрос, который должен был быть –
Право, когда я хотел добавить его в первый раз, вопрос был закрыт :) –
, если мы применим логику вашего кода к целым числам, 4 и 2 имеют (4-2) = два числа между ними. Поэтому из-за этой ошибки ваш ответ на один больше, чем правильный. –
Что вы подразумеваете под разными цифрами? Ваш вопрос о представлениях чисел с плавающей запятой на компьютере? Кроме того, я предполагаю, что вы хотели написать 3.4 x 10^38. –
Существует бесконечное число различных чисел между любыми двумя числами. Вы должны уточнить свой вопрос. – Nifle
Если вы имеете в виду действительные числа, то бесконечный ответ. Также, если вы говорите о рациональных или иррациональных числах. Также бесконечно. Но если вы имеете в виду целые числа, тогда проверьте мой ответ ниже. –