Си++: Есть ли минимальное (и максимальное) значение double?
<limits.h>
но я тебе его не скажу.
лучше сделай так:
double array[100]
...
double found_max = array[0];
for (i=1; i<100; i++)
{
if (array[i]>found_max) found_max=array[i]
}
о том, как бесконечность записывается в double можно прочитать в гугле
или в посте аттилы
С запросом минимум double и минимальное double. Там такая куча всего повылезла, что я подумал здесь наверно есть ктото, кто знает и кому не лень сказать.
Спасибо большое за ответы!
зы. Насчет max=array[0] я знаю, просто тут специфическая ситуация у меня, так сделать не получается (точнее чтобы так сделать, придется сильно прогемороиться). Да и максимум не по массиву ищется. Поэтому подумал что так сделать будет проще.
IEEE 754
Или float.h, если стандарт ломает искать...
И вообще это не имеет отношения к C++
Это представление вещественных чисел описывается стандартом IEEE (номер сейчас не смогу сказать).
В типе double мне опытным путём удалось установить, что под экспоненциальную часть выделено 11 бит, значит, под мантису -- 52 бита.
Число равно (-1)^s 2^(e - 1023) 1.m, где s -- знаковый бит, e -- экспоненциальная часть, m -- мантиса.
При этом если e = 0, то число равно (-1)^s 2^(-1022) 0.m.
Если e = 2047, m=0, то (-1)^s inf, а если m > 0, то nan.
Таким образом минимальное число в double равно (-1) 2^1023 1.11...11 (после двоичной точки 52 единицы). Это приблизительно 1.79769e+308.
Присваивать лучше используя union -- у минимального вещественного числа типа double все, кроме одного бита равны 1.
Удачи!
ЗЫ Опередили!
// numeric_limits_max.cpp
// compile with: /EHsc
#include <iostream>
#include <limits>
using namespace std;
void main( )
{
cout << "The maximum value for type float is: "
<< numeric_limits<float>::max( )
<< endl;
cout << "The maximum value for type double is: "
<< numeric_limits<double>::max( )
<< endl;
cout << "The maximum value for type float is: "
<< numeric_limits<int>::max( )
<< endl;
cout << "The maximum value for type short int is: "
<< numeric_limits<short int>::max( )
<< endl;
}
Да-а-а? А почему не к Паскалю, Бэйсику, Джаве, асмам(некоторым конечно да и вообще почти ко всем языкам программирования, где есть floating point вычисления? Чем так C++ от них отличается? IEEE есть IEEE - и ты в нём не найдёшь ни строчки про _конкретный_ язык.
ЗЫ Есть ещё IEEE 854, но это уже излишние навороты. Всё, другого не дано.
Потому что человек пишет программу на Си++ и это указал в своем вопросе. Кроме того, не уверен что в стандарте написано про то в каком формате числа в double хранятся.
Не уверен - почитай
Смысл такой, что типы float, double и long double расположены в порядке неубывания точности. А характеристики типов определяются через numeric_limits, так что я все верно написал.
Да-да, а я libc писАл однако... Блин, вот ведь дела - за несколько месяцев штудирования 10 страничек просмотрел самое главное Мне ещё и смысл объясняют
Неа. В стандарте описывается, как флоаты представляются - сколько битов на мантису, сколько на знак
это в IEEE описывается, а в стандарте Си++ - не нашел.
Да ты там дохрена просмотрел. Стандарт от 1998 года примерно 750 страниц занимает
Вероятно мы говорим о разных стандартах. Пожалуйста, укажи а) язык и компилятор(или либы если точно подходить к делу) б) ссылку на то, что этот компилятор использует floating point вычисления согласно стандарту XYU 666 (или какой там у тебя).
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.
1) Твой любимый компилятор C++ это Microsoft Visual С++
2)
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.- заявляю что ложь, не читая. Хотя может быть... В 750 страниц вполне могли заинклюдить 10 страничек, написанных в 85 году...
3) тут не нашёл упоминаний об ISO, зато чётко описан самый главный 1% IEEE 754.
PS Ты мне либы покажи и ссылку, что слова-то лить.
2) А ты посмотри, люди старались для тебя, писали.
Хм, пока не погуглилось
Если же флажок сброшен, то известно только то, что ты написал.
Ок, не ошибусь, если выдвину несколько предположений?2) Да, ieee туда не впихивали, написали только пару очень общих предложений. В целом поиск по "IEEE 754" даёт непустые результаты.
1) Твой любимый компилятор C++ это Microsoft Visual С++
2)В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.- заявляю что ложь, не читая. Хотя может быть... В 750 страниц вполне могли заинклюдить 10 страничек, написанных в 85 году...
3) тут не нашёл упоминаний об ISO, зато чётко описан самый главный 1% IEEE 754.
3) гугловский поиск 'msdn c++ "iso 14882"' выдал всё что угодно, но не msdn. О чём это говорит?..
И конечно, конечно же ieee 754 вполне удовлетворяет 2 предложениям из iso 14882 Там действительно преобразование float в double никогда не выставит inexact флаг
Короче надо очень сильно поискать, чтобы найти конкретные либы, не удовлетворяющие IEEE 754 (и тем более 854). Ибо они такие никому в повседневной жизни не нужны.
double max_dbl = DBL_MAX;
double min_dbl = -DBL_MIN;
Ссылка на стандарт в FAQ.
Не во всяком компьютере используется представление от ай-яй-яй.
---
...Я работаю антинаучным аферистом...
Т.е. такой код вообще бессмысленный:
if (x>double_max) ...
X чисто физически не может быть больше максимального.
X чисто физически не может быть больше максимальногоВо-первых, может.
Во-вторых, человеку нужно чтобы X было больше минимального.
Оставить комментарий
vertyal17
Чтобы использовать типа в таком алгоритмеdouble array[100]
...
double found_max = minimum_double;
for (i=0; i<100; i++)
{
if (array[i]>found_max) found_max=array[i]
}
идея в том, чтобы начально загнать в found_max такое число, чтобы при первом сравнении с array[0]>found_max всегда выполнялось.
Нет ли такого макроса или функции, возвращающего минимамльное значение, которое может принять переменная типа double ?