2015-10-08 11 views
1

Мне нужно создать функцию, где мне нужно значение квадрата. Мне сказали, что даже если начальное значение не слишком велико или не слишком мало, квадрат значений может все еще переполняться (возвращает inf) или underflow (возвращает 0), и мне нужно выяснить, как это предотвратить.Переполнение числа с плавающей запятой

Моя проблема: я даже не понимаю, какие числа могут вызвать переполнение при квадрате, когда само число не слишком велико.

Я думал, что это может быть не слишком малое число, например. 1/3 с повторением десятичных чисел, но MATLAB просто превращает это в 0.3333.

Может ли кто-нибудь дать мне пример такого числа или объяснить, какие цифры могут вызвать это?

+2

'nsingle = realmax ('double')' возвращает наибольшее положительное число с плавающей запятой. – obchardon

ответ

2

Для опустошения, давайте рассмотрим постоянную Планк: 6.626070040e-34

sqrt(6.626070040e-34) 
ans = 
    2.5741e-17 

Ну, это, видимо, не достаточно мало, давайте меньше:

sqrt(6.626070040e-340) 
ans = 
    0 

Там вашему опустошение.

Переполнение можно увидеть то же самое, просто использовать большие цифры:

sqrt(6.626070040e34) 
ans = 
    2.5741e+17 

sqrt(6.626070040e340) 
ans = 
    Inf 

Underflow означает, что цифры слишком малы для MATLAB для обработки, переполнение означает, что они являются слишком большими для MATLAB для обработки.

Благодаря @obchardon вот номера на моей системе 64bits MATLAB R2012a:

realmax('double') %//largest allowed double 
ans = 
    1.7977e+308 
realmin('double') %//smallest allowed double 
ans = 
    2.2251e-308 

Теперь, когда мы знаем, что наибольшее возможное значение в том, что MATLAB может работать, давайте попробуем идти ниже, и квадрат его:

(realmax('double')-10).^2 
ans = 
    Inf 

поэтому число мы пытались умиротворять здесь (realmax('double')-10) допускается по MATLAB, но не квадрируемая.

+2

Технически 'realmin' является только самым маленьким * нормализованным * двойным. 'eps (realmin)', например, возвращает число меньше, чем 'realmin' ... – Dan

+0

Подождите, часть вопроса, которую я делаю, говорит об этом« даже если число не слишком велико, его квадрат может переполняться » не номер, который вы дали в качестве примера, считаете слишком большим? – user1804234

+0

'sqrt (realmax ('double') + 1)' работает здесь, как и 'sqrt (realmax ('double') - 1)'. Вы можете попробовать перебирать числа, чтобы увидеть, где находится точный предел. – Adriaan

Смежные вопросы