2015-10-10 6 views
0

Я хочу рассчитать максимальное значение поплавка (скажем, f64) итеративно. Я думал о том, чтобы умножить некоторое число, например, 1,0 раза 2, пока оно не достигнет бесконечности, но оно не даст мне точного числа. Что-то вроде добавления мачете не будет работать ни потому, что это слишком медленно. Я уверен, что вам нужно увеличивать/уменьшать делитель/множитель на что-то каждый раз, когда вы достигаете бесконечности, но я не знаю, как это сделать.Расчет максимального значения поплавка

+0

Чтобы разработать правильный алгоритм вычисления наибольшего числа с плавающей запятой (кроме «Inf»), вам нужно знать о том, как реализованы числа с плавающей запятой; однако этого знания должно быть достаточно, чтобы вы могли привести вас к ответу без каких-либо вычислений. Так в чем смысл? – Jubobs

+0

Дело в том, что это упражнение, и мне потребовалось достаточно времени, чтобы мне было любопытно, как это сделать на самом деле. – JulioHug

+0

Вы не указали язык программирования. Например, если вы используете стандартно-совместимый компилятор C, а компилятор поддерживает семантику IEEE-754 (для этого может потребоваться флаг компилятора, такой как '/ fp: strict'), вы можете использовать:' printf («наибольшая величина:% 23.16e \ n ", nextafter (exp (1e10), 0.0));' который печатает '1.7976931348623157e + 308' на моей машине. 'exp (1e10)' оценивается до бесконечности, а 'nextafter()' производит наибольшую нормаль как следующую меньшую представимую величину. – njuffa

ответ

0

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

Это говорит, вычисляя полномочия 2 до тех пор, пока вы не получите сообщение об ошибке, а затем добавьте их от максимального к минимуму, пока не получите ошибку, должны работать.

+0

Хорошо, добавив, что каждый из них один раз не будет работать .. так что вложенный цикл я предполагаю, но это займет много времени. Я полагаю – JulioHug

+0

. Что вы получаете в * n * -битном типе при добавлении 2^(n- 1) + 2^(п-2) + ... + 2^0? Числа с плавающей запятой сохраняются с эквивалентом научной нотации, но принцип 2^n (2^0 + 2^-1 + ... + 2^-n) тот же. Самая большая проблема заключается в том, что ваша библиотека FP дает 2^(n-1) какое-то особое значение. – Davislor