Форум программистов, компьютерный форум CyberForum.ru

Double, int , long double - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
23.09.2012, 13:12     Double, int , long double #1
Как вычислить диапазоны типов вручную указанных в название темы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 13:12     Double, int , long double
Посмотрите здесь:

C++ Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию
C++ размер для данных (int, char, long, double, short, unsigned, float)
как написать такое явное преобразование из double в unsigned long int C++
Создать динамический массив, любого простого типа (например: int, long, float, double) C++
C++ long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
23.09.2012, 13:16     Double, int , long double #2
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <limits>
 
int main()
{
    std::cout << "Int max: " << std::numeric_limits<int>::max()
        << "\nInt min: " << std::numeric_limits<int>::min();
}
И т.д.
ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
23.09.2012, 13:34  [ТС]     Double, int , long double #3
Так и я могу. Читайте внимательнее. Мне надо определить без использования констант из заголовочного файла?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 13:35     Double, int , long double #4
Никак. Представление чисел с плавающей точкой — implementation-defined поведение. Никто не гарантирует, что там будет IEEE 754 или что-то ещё. Гарантируется, что у вас будут минимумы-максимумы и всё такое, доступные через std::numeric_limits.

Не по теме:

Если с казуистикой, то принципиально вы можете это выполнить, написав искусственный интеллект, который сделает реверс-инжиниринг битового представления floating-point-чисел.

ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
23.09.2012, 13:43  [ТС]     Double, int , long double #5
Вот задачка из Кернигана. Вы считает он требует невозможного?
Миниатюры
Double, int , long double  
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
23.09.2012, 13:51     Double, int , long double #6
ogcjm, а что подразумевает под собой вручную?

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <limits>
 
int main()
{
    int cur = 0, next = 0;
    while (++next > cur)
        cur = next;
    std::cout << cur << std::endl;
    // Для проверки
    std::cout << std::numeric_limits<int>::max() << std::endl;
    cur = next = 0;
    while (--next < cur)
        cur = next;
    std::cout << cur << std::endl;
    // Для проверки
    std::cout << std::numeric_limits<int>::min() << std::endl;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 14:24     Double, int , long double #7
Цитата Сообщение от ogcjm Посмотреть сообщение
Вот задачка из Кернигана. Вы считает он требует невозможного?
В общем случае да. Если для целых чисел ещё есть требование, чтобы они вели себя как в модулярной арифметике по модулю 2сколько битов на число, поэтому можно сделать что-то вроде
C++
1
2
3
4
int xd = 0;
for (int x = 1; xd < x; ++x, ++xd) {
  continue;
}
и ждать переполнения, то для вещественных можно только на честное слово полагаться: есть специальные значения для бесконечностей или нет (если да, то можно постепенным приближением найти супремумы/инфимумы), стандарт IEEE 754 или нет (если да, то точечным наблюдением за битами можно вычислить размеры порядка с мантиссой, а из них уже пределы).

Думаю, основная цель этого упражнения — разобраться с форматами представления чисел, а не решение любой ценой.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.09.2012, 14:31     Double, int , long double #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Представление чисел с плавающей точкой — implementation-defined поведение. Никто не гарантирует, что там будет IEEE 754 или что-то ещё
Разве это не от CPU/FPU зависит?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 14:35     Double, int , long double #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разве это не от CPU/FPU зависит?
Именно. Вот потому и implementation-defined. Только компилятор в курсе, что там за процессор и есть ли на нём вообще FPU или ему придётся выполнять все операции вручную. А он может взять и выполнять их в каком-то своём формате. Или у FPU может быть другой формат, а не IEEE 754.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
23.09.2012, 14:37     Double, int , long double #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Именно. Вот потому и implementation-defined. Только компилятор в курсе, что там за процессор и есть ли на нём вообще FPU или ему придётся выполнять все операции вручную. А он может взять и выполнять их в каком-то своём формате. Или у FPU может быть другой формат, а не IEEE 754.
А ну об этом и был вопрос. Я подумал ты имеешь ввиду реализацию компилятора.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 14:46     Double, int , long double #11
Ну и это тоже. Вообще говоря.

Я про тот самый "свой формат" на экзотический случай, если каким-то чудом CPU не имеет встроенного сопроцессора и даже встроенных микрокодов/макрокоманд для работы с вещественными числами. Стандарт в таком случае принципиально не запрещает различным компиляторам (а то и различным версиям) использовать различные форматы (вручную и по-своему эмулировать плавающую точку с помощью целых чисел), так что числа будут непереносимыми на уровне битового представления. Программы-вычислители-то будут работать правильно (пока значения в допустимых пределах), но вот всевозможные определители максимальных значений по битикам, которые у одной реализации на одном месте, а у другой — на своём, сломаются.

По стандарту они и так являются побитово непереносимыми (это вкладывается в понятия implementation-defined), но это формально. Фактически же в большинстве случаев используется один и тот же стандарт представления, так что всё переносимо.

Естественно, если брать случай IEEE 754, то достаточно посмотреть на число 0.75. По его единственному биту (вот тут ещё один implementation-defined момент: может быть как один бит, так и два) определить размер мантиссы, ещё один бит на знак, остальное на порядок. Этого хватит для вычисления предельных значений. Правда, тут неявная зависимость от sizeof :)
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.09.2012, 18:00     Double, int , long double #12
Для целых чисел как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <limits>
 
int main()
{
    typedef unsigned wchar_t int_t; //между typedef и int_t нужно написать требуемый тип
    
    int_t max_value = 0, one = 1;
    for (int_t i = 0, tmp; !i || int_t( one << i) > tmp; ++i)
    {
        tmp = one << i;
        max_value += tmp;
    }
        
    std::cout << "min value = " << +int_t(-max_value - 1) << std::endl;
    std::cout << "max value = " << +max_value << std::endl;
    std::cout << "Reality:" << std::endl;
    std::cout << "min value = " << +std::numeric_limits< int_t >::min() << std::endl;
    std::cout << "max value = " << +std::numeric_limits< int_t >::max() << std::endl;
}
Проверял не все типы, так что в абсолютной корректности не уверен.

С вещественными сложнее - надо как-то узнавать размер их мантиссы и экспоненты.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.10.2012, 20:37     Double, int , long double #13
Некропостинг, но все же.
Можно решить эту задачу и для вещественных чисел.
Для IEEE754 (код не мой)
Или даже так ;D
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
03.10.2012, 20:46     Double, int , long double #14
А для целых чисел я бы так написал:
C++
1
2
unsigned uint_max(~0u);
int int_max((~0)&(~(1<<(sizeof(int)*8-1))));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 21:22     Double, int , long double
Еще ссылки по теме:

C++ Вывести long double число без перевода в double
C++ LONG VS DOUBLE / INT VS FLOAT
C++ Shot int b long double

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
YuriiS
0 / 0 / 0
Регистрация: 12.06.2009
Сообщений: 18
27.10.2012, 21:22     Double, int , long double #15
Советую для интересующихся обработкой вещественных чисел ознакомиться с функцией dlamch из пакета LAPACK.
Yandex
Объявления
27.10.2012, 21:22     Double, int , long double
Ответ Создать тему
Опции темы

Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru