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

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

Восстановить пароль Регистрация
 
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
12.11.2010, 21:15     Почему оператор -- не воздействует на long double? #1
Есть код:
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;
приводит к такому-же результату...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2010, 21:15     Почему оператор -- не воздействует на long double?
Посмотрите здесь:

описание long double в С C++
Округление Long double. C++
C++ Long Double
Double, int , long double C++
C++ long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 01:05     Почему оператор -- не воздействует на long double? #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]$
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:00  [ТС]     Почему оператор -- не воздействует на long double? #3
Посмотрите в приложениях... Как это исправить? Деление/умножение работают, не работают только сложение и вычитание...
Миниатюры
Почему оператор -- не воздействует на long double?  
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 15:13     Почему оператор -- не воздействует на long double? #4
слева пишет, что это double, хотя это long double
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:17  [ТС]     Почему оператор -- не воздействует на long double? #5
Не подскажите, что можно с этим сделать?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 15:20     Почему оператор -- не воздействует на long double? #6
а вот пишут, что long double у них отображается в double
надо попробовать mingw, там может быть нормально с этим
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 19:54  [ТС]     Почему оператор -- не воздействует на long double? #7
Буду пробовать mingw...
Но самое странное во вложении. Все-таки хотелось бы разобраться в причинах такого странного поведения long double в microsoft visual studio...
Миниатюры
Почему оператор -- не воздействует на long double?  
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
13.11.2010, 20:06     Почему оператор -- не воздействует на long double? #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
Bazan
22 / 22 / 0
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 20:16  [ТС]     Почему оператор -- не воздействует на long double? #9
А под BSD у long double такая-же точность?
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
13.11.2010, 20:27     Почему оператор -- не воздействует на long double? #10
Какая такая же ?
Компилятор использует CPU
У CPU есть 80-битный вещественный тип, который компилятор обзывает long double
Соответственно под любой ОС будет так же

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

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

Если тебе нужная большая точность - смотри в сторону длинной арифметики
Там будут хоть 1000-значные числа
Считать правда будет медленно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2010, 22:29     Почему оператор -- не воздействует на long double?
Еще ссылки по теме:

long double и char C++
C++ Вывести long double число без перевода в double
Преобразование string в long double C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2797 / 1573 / 246
Регистрация: 03.05.2010
Сообщений: 3,650
13.11.2010, 22:29     Почему оператор -- не воздействует на long double? #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;
}
Yandex
Объявления
13.11.2010, 22:29     Почему оператор -- не воздействует на long double?
Ответ Создать тему
Опции темы

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