Си++: Есть ли минимальное (и максимальное) значение double?

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 ?

freezer

<limits.h>

aleks058

минимальное значение дабла есть, естественно!
но я тебе его не скажу.
лучше сделай так:

double array[100]
...
double found_max = array[0];
for (i=1; i<100; i++)
{
if (array[i]>found_max) found_max=array[i]
}

okunek

+-inf
о том, как бесконечность записывается в double можно прочитать в гугле
или в посте аттилы

vertyal17

Да я в гугл полез
С запросом минимум double и минимальное double. Там такая куча всего повылезла, что я подумал здесь наверно есть ктото, кто знает и кому не лень сказать.
Спасибо большое за ответы!
зы. Насчет max=array[0] я знаю, просто тут специфическая ситуация у меня, так сделать не получается (точнее чтобы так сделать, придется сильно прогемороиться). Да и максимум не по массиву ищется. Поэтому подумал что так сделать будет проще.

Anturag

IEEE 754

Anturag

Или float.h, если стандарт ломает искать...

Anturag

И вообще это не имеет отношения к C++

Serega009

Как вы знаете, вещественные числа в компьютере представляются следующим образом: бит под знак, экспоненциальная часть, мантиса. Есть и другие способы, но этот самый распространённый.
Это представление вещественных чисел описывается стандартом 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.
Удачи!
ЗЫ Опередили!

freezer

Может иметь и к Си++ отношение...

// 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;
}

Anturag

Да-а-а? А почему не к Паскалю, Бэйсику, Джаве, асмам(некоторым конечно да и вообще почти ко всем языкам программирования, где есть floating point вычисления? Чем так C++ от них отличается? IEEE есть IEEE - и ты в нём не найдёшь ни строчки про _конкретный_ язык.

Anturag

ЗЫ Есть ещё IEEE 854, но это уже излишние навороты. Всё, другого не дано.

freezer

Потому что человек пишет программу на Си++ и это указал в своем вопросе. Кроме того, не уверен что в стандарте написано про то в каком формате числа в double хранятся.

Anturag

Не уверен - почитай

freezer

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

Anturag

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

aleks058

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

freezer

это в IEEE описывается, а в стандарте Си++ - не нашел.

freezer

Да ты там дохрена просмотрел. Стандарт от 1998 года примерно 750 страниц занимает

Anturag

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

freezer

Я говорю о стандарте ISO 14882, стандарт языка Си++ за сентябрь 1998 года
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.

Anturag

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

Tasha2201

2) А ты посмотри, люди старались для тебя, писали.

Anturag

Хм, пока не погуглилось

Tasha2201

Можно определить, что тип соответствует IEEE 754 (флажок is_iec559 ISO/IEC 14882 18.2.1.1 numeric_limits)
Если же флажок сброшен, то известно только то, что ты написал.

Anturag

Ок, не ошибусь, если выдвину несколько предположений?
1) Твой любимый компилятор C++ это Microsoft Visual С++
2)
В нем ничего не сказано про то, что стандартный тип double обязан соответствовать IEEE # какой-то там.
- заявляю что ложь, не читая. Хотя может быть... В 750 страниц вполне могли заинклюдить 10 страничек, написанных в 85 году...
3) тут не нашёл упоминаний об ISO, зато чётко описан самый главный 1% IEEE 754.
2) Да, ieee туда не впихивали, написали только пару очень общих предложений. В целом поиск по "IEEE 754" даёт непустые результаты.
3) гугловский поиск 'msdn c++ "iso 14882"' выдал всё что угодно, но не msdn. О чём это говорит?..
И конечно, конечно же ieee 754 вполне удовлетворяет 2 предложениям из iso 14882 Там действительно преобразование float в double никогда не выставит inexact флаг
Короче надо очень сильно поискать, чтобы найти конкретные либы, не удовлетворяющие IEEE 754 (и тем более 854). Ибо они такие никому в повседневной жизни не нужны.

lord2476

include <limits>
double max_dbl = DBL_MAX;
double min_dbl = -DBL_MIN;

sergey_m

> Хм, пока не погуглилось
Ссылка на стандарт в FAQ.

Ivan8209

"Не во всякой игре тузы..."
Не во всяком компьютере используется представление от ай-яй-яй.
---
...Я работаю антинаучным аферистом...

yolki

минимальные и максимальные значения для double - на то они и максимальные и минимальные, что числа типа double не могут быть их больше или меньше.
Т.е. такой код вообще бессмысленный:

if (x>double_max) ...

X чисто физически не может быть больше максимального.

rosali

X чисто физически не может быть больше максимального
Во-первых, может.
Во-вторых, человеку нужно чтобы X было больше минимального.
Оставить комментарий
Имя или ник:
Комментарий: