Си++: Есть ли минимальное (и максимальное) значение 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]
}
+-inf
о том, как бесконечность записывается в double можно прочитать в гугле
или в посте аттилы
о том, как бесконечность записывается в double можно прочитать в гугле
или в посте аттилы
Да я в гугл полез 
С запросом минимум double и минимальное double. Там такая куча всего повылезла, что я подумал здесь наверно есть ктото, кто знает и кому не лень сказать.
Спасибо большое за ответы!
зы. Насчет max=array[0] я знаю, просто тут специфическая ситуация у меня, так сделать не получается (точнее чтобы так сделать, придется сильно прогемороиться). Да и максимум не по массиву ищется. Поэтому подумал что так сделать будет проще.

С запросом минимум 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.
Удачи!
ЗЫ Опередили!
Это представление вещественных чисел описывается стандартом 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 - и ты в нём не найдёшь ни строчки про _конкретный_ язык.
да и вообще почти ко всем языкам программирования, где есть floating point вычисления? Чем так C++ от них отличается? IEEE есть IEEE - и ты в нём не найдёшь ни строчки про _конкретный_ язык.ЗЫ Есть ещё IEEE 854, но это уже излишние навороты. Всё, другого не дано.
Потому что человек пишет программу на Си++ и это указал в своем вопросе. Кроме того, не уверен что в стандарте написано про то в каком формате числа в double хранятся.
Не уверен - почитай


Почитал. Тебе тоже советую. Раздел 3.9.1, пункт 8
Смысл такой, что типы float, double и long double расположены в порядке неубывания точности. А характеристики типов определяются через numeric_limits, так что я все верно написал.
Смысл такой, что типы float, double и long double расположены в порядке неубывания точности. А характеристики типов определяются через numeric_limits, так что я все верно написал.

Да-да, а я libc писАл однако... Блин, вот ведь дела - за несколько месяцев штудирования 10 страничек просмотрел самое главное
Мне ещё и смысл объясняют

Мне ещё и смысл объясняют

Неа. В стандарте описывается, как флоаты представляются - сколько битов на мантису, сколько на знак 

это в IEEE описывается, а в стандарте Си++ - не нашел.
Да ты там дохрена просмотрел. Стандарт от 1998 года примерно 750 страниц занимает 

Вероятно мы говорим о разных стандартах. Пожалуйста, укажи а) язык и компилятор(или либы если точно подходить к делу) б) ссылку на то, что этот компилятор использует floating point вычисления согласно стандарту XYU 666 (или какой там у тебя). 

Я говорю о стандарте ISO 14882, стандарт языка Си++ за сентябрь 1998 года
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.
Ок, не ошибусь, если выдвину несколько предположений?
1) Твой любимый компилятор C++ это Microsoft Visual С++
2)
3) тут не нашёл упоминаний об ISO, зато чётко описан самый главный 1% IEEE 754.
PS Ты мне либы покажи и ссылку, что слова-то лить.
1) Твой любимый компилятор C++ это Microsoft Visual С++
2)
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.- заявляю что ложь, не читая. Хотя может быть... В 750 страниц вполне могли заинклюдить 10 страничек, написанных в 85 году...
3) тут не нашёл упоминаний об ISO, зато чётко описан самый главный 1% IEEE 754.
PS Ты мне либы покажи и ссылку, что слова-то лить.
2) А ты посмотри, люди старались для тебя, писали.
Хм, пока не погуглилось


Можно определить, что тип соответствует IEEE 754 (флажок is_iec559 ISO/IEC 14882 18.2.1.1 numeric_limits)
Если же флажок сброшен, то известно только то, что ты написал.
Если же флажок сброшен, то известно только то, что ты написал.
Ок, не ошибусь, если выдвину несколько предположений?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). Ибо они такие никому в повседневной жизни не нужны.
include <limits>
double max_dbl = DBL_MAX;
double min_dbl = -DBL_MIN;
double max_dbl = DBL_MAX;
double min_dbl = -DBL_MIN;
> Хм, пока не погуглилось
Ссылка на стандарт в FAQ.
Ссылка на стандарт в FAQ.
"Не во всякой игре тузы..."
Не во всяком компьютере используется представление от ай-яй-яй.
---
...Я работаю антинаучным аферистом...
Не во всяком компьютере используется представление от ай-яй-яй.
---
...Я работаю антинаучным аферистом...
минимальные и максимальные значения для double - на то они и максимальные и минимальные, что числа типа double не могут быть их больше или меньше.
Т.е. такой код вообще бессмысленный:
X чисто физически не может быть больше максимального.
Т.е. такой код вообще бессмысленный:
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 ?