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

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

Войти
Регистрация
Восстановить пароль
 
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
#1

Почему оператор -- не воздействует на long double? - C++

12.11.2010, 21:15. Просмотров 838. Ответов 10
Метки нет (Все метки)

Есть код:
C++
1
2
3
std::cout<<setiosflags(std::ios::fixed)<<std::setprecision(0)<<average_value<<std::endl;
average_value--;
std::cout<<setiosflags(std::ios::fixed)<<std::setprecision(0)<<average_value<<std::endl;
Значение average_value - 1163878298844645100. Этот дважды код выводит 1163878298844645100...
Расскажите пожалуйста, почему так происходит и как это исправить?
P.S.
C++
1
average_value-=1;
приводит к такому-же результату...
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2010, 21:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему оператор -- не воздействует на long double? (C++):

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

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

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

Double, int , long double - C++
Как вычислить диапазоны типов вручную указанных в название темы?

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Long Double - C++
Разве нет типа более емкого, чем Double в Visual studio? Long Double, как я понял, определяется как обычный Double. А мне нужен аналог по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 01:05 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main(void)
{
    long double n = 1163878298844645100.0L;
    
    cout.precision(20);
    cout << n << endl;
    cout << --n << endl;
    cout << --n << endl;
    
    return 0;
}
Код
[guest@localhost tests]$ g++ t.cpp -o t
[guest@localhost tests]$ ./t
1163878298844645100
1163878298844645099
1163878298844645098
[guest@localhost tests]$
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:00  [ТС] #3
Посмотрите в приложениях... Как это исправить? Деление/умножение работают, не работают только сложение и вычитание...
0
Миниатюры
Почему оператор -- не воздействует на long double?  
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 15:13 #4
слева пишет, что это double, хотя это long double
0
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:17  [ТС] #5
Не подскажите, что можно с этим сделать?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 15:20 #6
а вот пишут, что long double у них отображается в double
надо попробовать mingw, там может быть нормально с этим
1
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 19:54  [ТС] #7
Буду пробовать mingw...
Но самое странное во вложении. Все-таки хотелось бы разобраться в причинах такого странного поведения long double в microsoft visual studio...
0
Миниатюры
Почему оператор -- не воздействует на long double?  
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
13.11.2010, 20:06 #8
В принципе тебе уже все сказали
В VS считает что long double == double
Точность у double - 16 десятичных цифр
Твое число просто не влазит нормально в double,
соответственно прибавление к нему единицы отваливается по точности

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
using namespace std;
 
int main(void)
{
    long double n = 1163878298844645345.0L;
    
    cout.precision(20);
    cout << n << endl;
    cout << --n << endl;
    cout << --n << endl;
    
    return 0;
}
Запустим тест - увидим еще более интересный результат
Код
> test.exe
1163878298844645400
1163878298844645400
1163878298844645400

А c gcc понятно проблемы нету
Даже под Windows у gcc тип long double имеет точность 19 цифр
Что впрочем близко к пределу твоего числа
Сделай число чуть длинеее - и не поможет long double
1
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 20:16  [ТС] #9
А под BSD у long double такая-же точность?
0
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
13.11.2010, 20:27 #10
Какая такая же ?
Компилятор использует CPU
У CPU есть 80-битный вещественный тип, который компилятор обзывает long double
Соответственно под любой ОС будет так же

Microsoft VS (видимо для совместимости со старыми версиями Windows) делает long double == double == 64-битное вещественное

Бывает тип 128-битный вещественный - binary128
Но насколько я знаю процы Intel/AMD аппаратно не поддерживают такой тип

Если тебе нужная большая точность - смотри в сторону длинной арифметики
Там будут хоть 1000-значные числа
Считать правда будет медленно
1
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.11.2010, 22:29 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <limits>
//////////////////////////////////////////////////////////////////////////////////////
template<class T>
struct  T_print_max_mantissa
{    
    T_print_max_mantissa()
    {
        std::cout << "Для типа "    
                  << typeid(T).name()
                  << " максимальное значение мантиссы равно "                  
                  << ((long long)1 << std::numeric_limits<T>::digits)                  
                  << ", "
                  << std::endl
                  << "что означает, что на числа, превышающие это по модулю, "
                  << std::endl
                  << "не действуют операторы \"++\" и \"--\"."                  
                  << std::endl
                  << std::endl
                  << std::endl;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
    std::locale::global(std::locale(""));
 
    T_print_max_mantissa<float>        f;
    T_print_max_mantissa<double>       d;
    T_print_max_mantissa<long double>  ld;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2010, 22:29
Привет! Вот еще темы с ответами:

описание long double в С - C++
Подскажите как правильно ввести переменнуя типа long double в языке С integer-------------%d float----------------%f double...

Перевод из double в long - C++
Можно ли как-то перевести число double в 2 числа long так, чтобы одно число было его целой частью, а другое дробной?

Long double и Borland 3.1 - C++
обнаружено на процессоре 486SX с Borland 3.1, на нем экспонента считается до 4932, далее ошибка overflow DosBox+ core i7 на win7х64 +...

Long float и double - C++
В чем отличие long float от double?


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

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

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