Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
22 / 22 / 4
Регистрация: 15.04.2009
Сообщений: 100
1

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

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

Author24 — интернет-сервис помощи студентам
Есть код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2010, 21:15
Ответы с готовыми решениями:

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

Чем различаются long long и long double?
long long или long double

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

Too few parametrs in call to '_fastcall LogN(cont log double, const long double)'
void __fastcall TForm1::Button1Click(TObject *Sender) {int n; double...

10
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
22 / 22 / 4
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:00  [ТС] 3
Посмотрите в приложениях... Как это исправить? Деление/умножение работают, не работают только сложение и вычитание...
Миниатюры
Почему оператор -- не воздействует на long double?  
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.11.2010, 15:13 4
слева пишет, что это double, хотя это long double
0
22 / 22 / 4
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 15:17  [ТС] 5
Не подскажите, что можно с этим сделать?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
13.11.2010, 15:20 6
а вот пишут, что long double у них отображается в double
надо попробовать mingw, там может быть нормально с этим
1
22 / 22 / 4
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 19:54  [ТС] 7
Буду пробовать mingw...
Но самое странное во вложении. Все-таки хотелось бы разобраться в причинах такого странного поведения long double в microsoft visual studio...
Миниатюры
Почему оператор -- не воздействует на long double?  
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
22 / 22 / 4
Регистрация: 15.04.2009
Сообщений: 100
13.11.2010, 20:16  [ТС] 9
А под BSD у long double такая-же точность?
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
Эксперт С++
3225 / 1752 / 436
Регистрация: 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
13.11.2010, 22:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2010, 22:29
Помогаю со студенческими работами здесь

Какой спецификатор использовать для корректного вывода типа данных double и long double
Подскажите пожалуйста, какой спецификатор использовать для корректного вывода типа данных double и...

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

Количество знаков после запятой double, Long double
Есть число большой точности A. A=-1.768573656315270993281 742915329544712934120053405549882...

Как обойтись без float, double, long double?
К примеру мне надо в программе использовать что-то вроде -0,00000000000003626686812 и...

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

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru