![]() |
|
Модераторы: bsa |
![]()
|
|
| cupper |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Нужно преобразовывать число с плавающей точкой (представленное в виде класса, мантиса + экспонента) в строку. В классе есть метод перевода числа в double, он не подходит так как в некоторых случаех сбивается точность и получается не совсем то что хотелось получить.
Написал вот такую функцию
Проверил на таком наборе данных
Получил следующее
если я правильно понял теорию, то все правильно. Тему создал что бы точность убедится в том что не упустил не каких деталей в числах с плавающей точкой. Если говорить кратко, то 1. если экспонента > 0 то мы просто к мантиссе прибавляем в конце это количество нулей. 2. если экспонента = 0 мы оставляем число как оно есть в мантиссе. 3. если экспонента < 0, то нужно производить отсчет с права на лево в мантиссе на абсолютное значение мантиссы, дополняя его с лева нулями, и после первого нуля с левой стороны ставить запятую. Вроде больше нету других вариантов ? |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
А как у вас должно напечататься Decimal(3475, -1000) или Decimal(3475, 1000) ?
Добавлено через 32 секунды Кроме того, у вас экспонента десятичная? |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
вроде всё правильно. Я б переделал последний if так
просто, чтобы убрать 2 insert'а, но IMHO это некритично. Ещё б передавать символ разделителя разрядов. По-умолчанию пусть будет '.'
Ну ище пару моментов. Зачем в ф-ции decimal_to_string, возвращающей копию строки, возвращаемое значение (копия) const ?
отладочная фигня ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| cupper |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
Decimal(3475, -1000) = 0.00000...003475 Decimal(3475, 1000) = 347500000...0000 где нулей в первом случаем будет 1000 - len("3475") а во втором случае 1000 нулей добавится. да экспонента и мантисса целы числа. Мантисса 64 разрядная, экспонента 32 разрядная. Не я архитектор класса, но я столкнулся с тем что нет нормального способа его представления в строку.
да, так по лучше смотрится. Про конст тут такая заморочка
ошибка допущенная по глупости всплывет сразу. Без const будет epic fail. Об этом во многих книжках пишут. Вот приучил себя к хорошему стилю.
она самая
для целостности картины, нужно. Для моей задачи нет необходимости. Это сообщение отредактировал(а) cupper - 25.4.2011, 22:16 |
||||||||||
|
|||||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
в данном случае не будет (у std::string нет оператора приведения ни к bool, ни к int ни к указателю), но в общем случае за совет спасибо. Попробую тоже принять для себя такое правило -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Если при вычислении возникнет большое (или маленькое) число, то.. будет полный ахтунг. допустим exp ~ 2**31 std::string zero(exp, '0'); // создали строку размером 2 гигабайта double_val.append(zero); // откопировали строку в другую. уже 4 гига оперативки. .. при exp ~ -2**31 std::string zero(exp_abs - len_mantisa + 1, '0'); // создали строку размером 2 гигабайта double_val.insert(0, zero); // сдвинули на 1 строку размером 2 гигабайта. (фактически компилятор создаст копию 2 гигов.) double_val.insert(1, "."); // еще раз сдвинули на 1 строку размером 2 гигабайта. .. return double_val; // И под занавес откопировали еще разок. итого 6 гигов оперативки на работу строль незамысловатой функции. Это не программа, а бомба замедленного действия. И когда-нибудь она обязательно сработает. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
нельзя ли уточнить, в чем проявляется разница при наличии/отсутствия const в примере ? |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
mes, при конст - компилер выдаст ошибку, что надо L-value и т.д. При не конст - он проглотит, ну может выдаст воринг (хотя по умолчанию, напрмер, студия даже воринг не выдает в таких случаях) Подразумевается, что здесь программер опечатался и хотел: if(Decimal_to_string(...) == "34.75" всмысле два ==, а не одно = |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
mes, Вот покопался, нашел у Мейерса, ТС просто не совсем удачный пример с ифом привел.
Мейерс С. - Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ.(3-изд) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| cupper |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 525 Регистрация: 29.11.2006 Репутация: нет Всего: 1 |
В общем случае да. У меня же не стоит задача в которой такие числа хоть когда то смогли бы фигурировать. В общем мое решение для моей области применения, но в общем случае оно на врядли подойдет, вы правы. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |