Я хочу рассчитать максимальное значение поплавка (скажем, f64) итеративно. Я думал о том, чтобы умножить некоторое число, например, 1,0 раза 2, пока оно не достигнет бесконечности, но оно не даст мне точного числа. Что-то вроде добавления мачете не будет работать ни потому, что это слишком медленно. Я уверен, что вам нужно увеличивать/уменьшать делитель/множитель на что-то каждый раз, когда вы достигаете бесконечности, но я не знаю, как это сделать.Расчет максимального значения поплавка
ответ
Стандартная библиотека вашего языка программирования должна давать вам константу, представляющую числовые ограничения ваших типов. Если вы хотите попробовать цикл, вы должны внимательно прочитать документацию об ошибках (включая потерю точности и переполнение) и помните, что наибольшее представимое число - это не просто самый большой показатель, но самый большой показатель, умноженный на наибольший мантисса.
Это говорит, вычисляя полномочия 2 до тех пор, пока вы не получите сообщение об ошибке, а затем добавьте их от максимального к минимуму, пока не получите ошибку, должны работать.
Хорошо, добавив, что каждый из них один раз не будет работать .. так что вложенный цикл я предполагаю, но это займет много времени. Я полагаю – JulioHug
. Что вы получаете в * n * -битном типе при добавлении 2^(n- 1) + 2^(п-2) + ... + 2^0? Числа с плавающей запятой сохраняются с эквивалентом научной нотации, но принцип 2^n (2^0 + 2^-1 + ... + 2^-n) тот же. Самая большая проблема заключается в том, что ваша библиотека FP дает 2^(n-1) какое-то особое значение. – Davislor
Чтобы разработать правильный алгоритм вычисления наибольшего числа с плавающей запятой (кроме «Inf»), вам нужно знать о том, как реализованы числа с плавающей запятой; однако этого знания должно быть достаточно, чтобы вы могли привести вас к ответу без каких-либо вычислений. Так в чем смысл? – Jubobs
Дело в том, что это упражнение, и мне потребовалось достаточно времени, чтобы мне было любопытно, как это сделать на самом деле. – JulioHug
Вы не указали язык программирования. Например, если вы используете стандартно-совместимый компилятор C, а компилятор поддерживает семантику IEEE-754 (для этого может потребоваться флаг компилятора, такой как '/ fp: strict'), вы можете использовать:' printf («наибольшая величина:% 23.16e \ n ", nextafter (exp (1e10), 0.0));' который печатает '1.7976931348623157e + 308' на моей машине. 'exp (1e10)' оценивается до бесконечности, а 'nextafter()' производит наибольшую нормаль как следующую меньшую представимую величину. – njuffa