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

Перевод long double в строку - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
09.07.2013, 07:23     Перевод long double в строку #1
Кто мне объяснит, почему тут long double последнюю цифру дробит...
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
void ld_to_str(long double ld, char str[])
{
    double d1;
    d1 = ld;
    int j = 0, i = 0, a = 0;
    if(d1 == 0)
        str[a++] = '0';
    while(d1 >= 1)
    {
        d1 /= 10;
        j++;
    }
    while(d1 != 0)
    {
        d1 *= 10;
        i = d1;
        d1 -= i;
        if(a == j && d1 != 0)
        {
            str[a++] = ',';
            str[a++] = i + '0';
        }
        else
            str[a++] = i + '0';
    }
    str[a] = '\0';
}
Добавлено через 20 часов 2 минуты
Я имею ввиду что d1 после вычитания последней цифры приобретает вид 0,000000000000082349287349287349812734, примерно так.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2013, 11:10     Перевод long double в строку #21
Цитата Сообщение от Croessmah Посмотреть сообщение
и MinGW тоже обрезает. Просто,
У меня, в Code::Blocks, mingv не обрезает. Выводит 11 знаков.

Добавлено через 4 минуты

Не по теме:

Я вообще не понял, с чего это to_string() в 10 студии работает? Это же С++11?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
10.07.2013, 11:13
  #22

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
в 10 студии работает?
может tr1 есть

alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2013, 11:22     Перевод long double в строку #23

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
может tr1 есть
Это что?


Если так сделать, то выводит 10 знаков:
C++
1
2
3
4
5
6
7
std::stringstream s;
s.precision(10);
    
long double ld = 12345.12345;
s << ld;
std::string string_value = s.str();
cout << string_value << endl;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2013, 11:25     Перевод long double в строку #24
В VS2010 to_string() реализован через свой доморощенный sprintf_s с форматом "%Lg", что вообще выводит в научном формате, а для 123456.123456 тупо обрезает дробную часть. И получаем "123456".
В VS2012 уже сделали через ostream c ios_base::fixed, так что дробную часть выведет, но максимум 6 знаков.
Croessmah
10.07.2013, 11:28
  #25

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Это что?
C++ Technical Report 1

alsav22
10.07.2013, 11:31
  #26

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
тупо обрезает дробную часть
Дробная часть тут, наверное, ни при чём. Просто шесть знаков оставляет.

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.07.2013, 11:40     Перевод long double в строку #27
Цитата Сообщение от alsav22 Посмотреть сообщение
Дробная часть тут, наверное, ни при чём. Просто шесть знаков оставляет.
Там не всё так просто:
Миниатюры
Перевод long double в строку  
alsav22
10.07.2013, 12:09
  #28

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Там не всё так просто:
Как ни крути, всё равно не больше шести.

Tulosba
10.07.2013, 12:14
  #29

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Как ни крути, всё равно не больше шести.
Если не считать символ "e" и степень, то да.

Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
10.07.2013, 14:06  [ТС]     Перевод long double в строку #30
Попробую сменить среду.

Добавлено через 33 минуты
Code::Blocks выдаёт, что to_string() не объявлен в этой области...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11830 / 6809 / 769
Регистрация: 27.09.2012
Сообщений: 16,883
Записей в блоге: 2
Завершенные тесты: 1
10.07.2013, 14:07     Перевод long double в строку #31
Цитата Сообщение от Асурус Посмотреть сообщение
Code::Blocks выдаёт, что to_string() не объявлен в этой области...
Стандарт C++11
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
10.07.2013, 14:28     Перевод long double в строку #32
Асурус, как советовали выше, можно в качестве альтернативы использовать std::stringstream:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
 
std::string ld_to_str(long double ld)
{
    std::stringstream str;
    str.precision(10);
    std::string rep;
    str << ld;
    str >> rep;
    return rep;
}
 
int main()
{
    long double ld = 12345.12345;
    std::string string_value = ld_to_str(ld);
    cout << string_value << endl;
    return 0;
}
где str.precision(10); установление "точности" значения.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2013, 14:35     Перевод long double в строку #33
Цитата Сообщение от Асурус Посмотреть сообщение
Code::Blocks выдаёт, что to_string() не объявлен в этой области...
К Code::Blocks нужно компилятор подключить, у которого to_string() работает. Например этот:
http://sourceforge.net/projects/mingwbuilds/

Добавлено через 2 минуты
И в настройках компилятора включить поддержку С++11.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2013, 14:45     Перевод long double в строку
Еще ссылки по теме:

C++ Вывести long double число без перевода в double
Перевод из String в long long C++
Почему перестает работать программа при замене double на long double? C++

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

Или воспользуйтесь поиском по форуму:
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
10.07.2013, 14:45  [ТС]     Перевод long double в строку #34
xtorne21st, Спасибо большое, теперь всё как надо
Yandex
Объявления
10.07.2013, 14:45     Перевод long double в строку
Ответ Создать тему
Опции темы

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