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

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

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

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

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

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

long double и char - C++
Товарищи, помогите чайнику разобраться в данном теоретическом вопросе: long double* m=95; m--; m=? char* t=2; t-=4; t=?

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

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

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

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

Округление Long double. - C++
Нужно округлить число типа long double в меньшую сторону т.е. просто обнулить всю дробную часть, но при этом надо сохранить эту самую...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4821 / 3241 / 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
4821 / 3241 / 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
4821 / 3241 / 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
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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?
Еще ссылки по теме:

Cлучайные числа long double - C++
Всем привет! Столкнулся с такой проблемой не могу придумать функцию для генерации случайных чисел типа long double в диапазоне -5*10^321 до...

Вывод константы long double - C++
Доброго времени суток! Учусь программировать на С++ и возникла такая проблема: есть константа 6.626068E-034. я назначил тип long...

Перевод long double в строку - C++
Кто мне объяснит, почему тут long double последнюю цифру дробит... void ld_to_str(long double ld, char str) { double d1; d1 = ld;...

Преобразование long double в string - C++
Здравствуйте уважаемые форум чане! Будьте так добры, подскажите выход из сложившейся ситуации!Как преобразовать числовое значение допустим...

Преобразование long double в char - C++
Вернемся к обсуждению денежных строк из упражнения 6. Напишите ме- од ldtoms() для преобразования числа типа long double в денежную строку,...


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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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?
Ответ Создать тему
Опции темы

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