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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
#1

Double, int , long double - C++

23.09.2012, 13:12. Просмотров 1364. Ответов 14
Метки нет (Все метки)

Как вычислить диапазоны типов вручную указанных в название темы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2012, 13:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Double, int , long double (C++):

Shot int b long double - C++
есть задание нужно поменять местами значения бит в заданном количестве пар бит. Номера бит в парах задаются с клавиатуры. используя shot...

LONG VS DOUBLE / INT VS FLOAT - C++
Всем доброго времени суток! Объясните пожалуйста почему при следующем коде #include <iostream> using namespace std; int main() ...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

Вывести long double число без перевода в double - C++
Надо вывести long double число без перевода в double. Пишу: printf("%Lf",S); и выводится неверно. Компилятор -- MinGW, та же фишка на...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std; double polp(double af,double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Петррр
5949 / 3386 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
23.09.2012, 13:16 #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  [ТС] #3
Так и я могу. Читайте внимательнее. Мне надо определить без использования констант из заголовочного файла?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 13:35 #4
Никак. Представление чисел с плавающей точкой — implementation-defined поведение. Никто не гарантирует, что там будет IEEE 754 или что-то ещё. Гарантируется, что у вас будут минимумы-максимумы и всё такое, доступные через std::numeric_limits.

Не по теме:

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

ogcjm
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 34
23.09.2012, 13:43  [ТС] #5
Вот задачка из Кернигана. Вы считает он требует невозможного?
Миниатюры
Double, int , long double  
Петррр
5949 / 3386 / 337
Регистрация: 28.10.2010
Сообщений: 5,926
23.09.2012, 13:51 #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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.09.2012, 14:24 #7
Цитата Сообщение от ogcjm Посмотреть сообщение
Вот задачка из Кернигана. Вы считает он требует невозможного?
В общем случае да. Если для целых чисел ещё есть требование, чтобы они вели себя как в модулярной арифметике по модулю 2сколько битов на число, поэтому можно сделать что-то вроде
C++
1
2
3
4
int xd = 0;
for (int x = 1; xd < x; ++x, ++xd) {
  continue;
}
и ждать переполнения, то для вещественных можно только на честное слово полагаться: есть специальные значения для бесконечностей или нет (если да, то можно постепенным приближением найти супремумы/инфимумы), стандарт IEEE 754 или нет (если да, то точечным наблюдением за битами можно вычислить размеры порядка с мантиссой, а из них уже пределы).

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

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

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

Естественно, если брать случай IEEE 754, то достаточно посмотреть на число 0.75. По его единственному биту (вот тут ещё один implementation-defined момент: может быть как один бит, так и два) определить размер мантиссы, ещё один бит на знак, остальное на порядок. Этого хватит для вычисления предельных значений. Правда, тут неявная зависимость от sizeof :)
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.09.2012, 18:00 #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
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.10.2012, 20:37 #13
Некропостинг, но все же.
Можно решить эту задачу и для вещественных чисел.
Для IEEE754 (код не мой)
Или даже так ;D
Shandr_71
13 / 13 / 1
Регистрация: 05.12.2011
Сообщений: 84
03.10.2012, 20:46 #14
А для целых чисел я бы так написал:
C++
1
2
unsigned uint_max(~0u);
int int_max((~0)&(~(1<<(sizeof(int)*8-1))));
YuriiS
0 / 0 / 0
Регистрация: 12.06.2009
Сообщений: 18
27.10.2012, 21:22 #15
Советую для интересующихся обработкой вещественных чисел ознакомиться с функцией dlamch из пакета LAPACK.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 21:22
Привет! Вот еще темы с ответами:

Как написать такое явное преобразование из double в unsigned long int - C++
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто поможет...

Размер для данных (int, char, long, double, short, unsigned, float) - C++
Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию (о...

Создать динамический массив, любого простого типа (например: int, long, float, double) - C++
1. Создать проект, который содержит консольную программу Win32. 2. Создать динамический массив, любого простого типа (например: int,...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.10.2012, 21:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru