Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с функцией boost::lexical_cast  (Прочитано 12699 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ind
Интересующийся

ua
Offline Offline

« : 05-08-2010 09:58 » 

Проблема следующая: при преобразовании вещественных типов в строку, функция какого-то хрена дописывает к числу много нулей и единицу в последнем знаке. Мне кажется, что такое поведение функции не соответствует ее предназначению. Что это, баг, или я не учел какой-то нюанс?

Вот пример:
Код:
#include <iostream>
#include <boost/lexical_cast.hpp>

using namespace std;

int main()
{
string str;
double d = 3.14;
str = boost::lexical_cast<string>(d);
cout << d << endl << str << endl;
return 0;
}

Вывод программы:
3.14
3.14000000000000001

При преобразовании к типу float, количество нулей заметно сокращается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 05-08-2010 10:04 » 

особенности двоичного представления, надо полагать ) Задавайся точностью или забей
Записан

ind
Интересующийся

ua
Offline Offline

« Ответ #2 : 05-08-2010 10:14 » 

Прости, не понял что значит "задавайся точностью"?
Забить не могу, т.к. нужен корректный результат. Если это баг библиотеки, то нужно отправлять разработчикам, а если нет - нужно понять где я чего недопонял и как заставить функцию работать правильно.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 05-08-2010 10:28 » 

Прости, не понял что значит "задавайся точностью"?
Точность - это количество значащих разрядов

А про библиотеку эту не знаю, не пользовался.
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 05-08-2010 11:09 » 

Прости, не понял что значит "задавайся точностью"?

Попробуй так:

Код:
boost::lexical_cast_stream<std::string,double>::stream()  << std::setprecision(2);
str = boost::lexical_cast<std::string>(d);
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ind
Интересующийся

ua
Offline Offline

« Ответ #5 : 08-08-2010 09:33 » 

Явное задание точности может решить проблему данного конкретного числа (3.14), но оно выбрано просто для примера. Меня же интересует работа функции в общем, т.е. для произвольного числа, точность задания которого мне заранее неизвестна. И естественно, должны выводиться только значащие цифры после точки, без кучи нулей да еще с единицей на конце.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 08-08-2010 13:49 » 

Тогда тебе надо начать с теории типов с плавающей запятой в компьютерном представлении. Они ВСЕ задаются с некоей точностью. А уж тем более иррациональные числа.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ind
Интересующийся

ua
Offline Offline

« Ответ #7 : 08-08-2010 15:15 » 

То, что вещественные числа представляются в машине с конечной точностью, я понимаю. Но почему функция lexical_cast добавляет к моему числу единицу в n-м разряде после точки?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 08-08-2010 15:28 » 

ind, почитай о формате хранения: http://en.wikipedia.org/wiki/Double_precision_floating-point_format





« Последнее редактирование: 08-08-2010 15:44 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 08-08-2010 15:39 » 

ind, на самом деле там немножко больше:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ind
Интересующийся

ua
Offline Offline

« Ответ #10 : 09-08-2010 12:55 » new

Спасибо за ссылки, будем разбираться  Здесь была моя ладья...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines