anonymous@RULINUX.NET~# Last login: 2024-04-20 11:15:53
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Округление double то нужного кол-ва знаков после запятой. Срочно.

Граждане, а не могли бы вы накидать мне ссылков на алгоритмы округления типа double до произвольного знака после запятой?
А то тут наткнулся на реализацию подобной функции, которая выглядит как явный баг, но доказать не могу (тем более что ошибка в пределах эпсилона, но её там могло бы не быть).

anonymous(*) (2012-03-15 23:57:40)

[Ответить на это сообщение]
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Знака двоичного или десятичного?

vilfred(*)(2012-03-16 00:05:01)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

snprintf(buf, len, "%0.2f", in) + sscanf(buf, "%f", &out);

vilfred(*)(2012-03-16 00:09:49)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Алгоритм давай, в котором сомневаешься. Ну и насколько платформеннонезависимым должен быть

vilfred(*)(2012-03-16 00:10:16)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

http://stackoverflow.com/questions/798046/digit-limitation-from-decimal-point-in-c

vilfred(*)(2012-03-16 00:11:02)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Десятичного, с двоичным-то всё просто

anonymous(*)(2012-03-16 00:11:43)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Меня больше интересует алгоритмическая сторона вопроса

anonymous(*)(2012-03-16 00:12:25)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Алгоритм дать не могу - проприетарщина, выпасут - выебут.

anonymous(*)(2012-03-16 00:14:35)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

ну... не знаю...

vilfred(*)(2012-03-16 00:14:48)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Выбрать пример с floor и 0.5

?

vilfred(*)(2012-03-16 00:19:10)
Отредактировано vilfred по причине "не указана"
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Если проприетарщина, предлагаю домножать на нужное кол-во нулей, а все остальное после запятой дропать или я не понял вопроса ?

anonymous(*)(2012-03-16 00:20:29)

Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Iceweasel/10.0.2
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Да проблема в том что нужно как-то обосновать что текущая имплементация говно, остальное пускай девелоперы думают чо как фиксить. Алгоритм там не совсем такой как ты описываешь - поэтому и пытаюсь найти чего-нить похожее чтобы понять зачем так вообще делали

anonymous(*)(2012-03-16 00:27:15)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

int(a*(10^n)) / double(10^n)

vilfred(*)(2012-03-16 02:27:02)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

хм умножаешь на 10^(нужное количество знаков), добавляешь 0,5 если нужно округлить, а не просто отбросить лишние цифры, отбрасываешь дробную часть и потом делишь на то же 10^(нужное количество знаков), вроде всё очевидно. Типа того

b = trunc (a * 1000.0 + 0.5) / 1000.0;

при крупных числах может быть баг переполнения, посему для них нужны особые извраты, но это редко нужно.

bugmaker(*)(2012-03-16 04:08:24)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

> Алгоритм дать не могу - проприетарщина
С каких это пор алгоритмы являются проприетарщиной? На них вроде даже патенты в нормальных странах не дают. Чего скрывать?

anonymous(*)(2012-03-16 10:31:35)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

> b = trunc (a * 1000.0 + 0.5) / 1000.0;
Если было бы сделано так - то я бы не удивлялся.
А ты можешь объяснить почему именно через trunc у тебя реализовано? Почему бы не сделать так:
b = round(a * 1000.0) / 1000.0;
Например на одну операцию (сложения) меньше выходит? Через trunc - это правильнее, производительнее, точнее или что?

> при крупных числах может быть баг переполнения, посему для них нужны особые извраты, но это редко нужно.
Что за извраты? Наверное они меня и интерсуют. То, на что я смотрю выглядит как бажный индусокод, но может оказаться чем-то охуенно гениальным. Плюс там не только тупое переполнение будет, но проблема приведения чисел к одинаковой экспоненте при которой "0.5" утратит значимость, но я не вижу как тот код, на который я смотрю, мог бы решить эту проблему.

anonymous(*)(2012-03-16 13:14:45)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

> С каких это пор алгоритмы являются проприетарщиной? На них вроде даже патенты в нормальных странах не дают. Чего скрывать?

Не я пишу полиси в своей конторе.

anonymous(*)(2012-03-16 14:26:21)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

фапси чтоли какоеннить?

vilfred(*)(2012-03-16 14:34:00)

avatar
  • матерные выражения
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

Мущщина, ебанитесь! Любой корпорац делает это.

anonymous(*)(2012-03-16 16:38:07)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

> Через trunc - это правильнее, производительнее, точнее или что?
нет, одинаково. Если нужна эта добавка 0.5 пользуй round, без разницы.

> Что за извраты? Наверное они меня и интерсуют.
например просто проверка на величину числа, если оно по размеру превышает некоторую величину, то либо заведомо точности не хватает для отображения знаков после запятой и можно ничего не делать для их отбрасывания, либо взять

trunc(a) + round(1000.0*(a - trunc(a)))/1000.0;

тоесть работать только с дробной частью, заведомо избежав риска умножить какое-нибудь 1.0Е+306 так что результат вызовет переполнение

bugmaker(*)(2012-03-17 05:35:05)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Срочно.

у нас тут приличный форум и так выражаться не принято

bugmaker(*)(2012-03-17 05:35:53)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Уже не срочно.

Вобщем и месяца не прошло как разобрались - код там и правда непростой. Дело в том что вышеприведённые варианты округления не для всех чисел одинаково хорошию Есть такие значения, что не помещаются в разрядной сетке мантиссы и поэтому double их обрубает c уменьшением абсолютного значения. Вот например 0.85 округлённое по твоим формулам до тысячных, после округления станет несколько меньше:

c

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main(void){
  double a=0.85;
  double b = trunc (a * 1000.0 + 0.5) / 1000.0;
  double b2=trunc(a) + round(1000.0*(a - trunc(a)))/1000.0;
  printf("%.60f\n",b);
  printf("%.60f\n",b2);
  return 0;
}
 
А это не годится например при интенсивном накоплении суммы вычислений в которых используется округление, ошибка ведь будет накапливаться. Приходится извращаться.

anonymous(*)(2012-04-14 02:36:32)
Отредактировано anonymous по причине "не указана"
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Уже не срочно.

Это вообще-то не имеет ничего с округлением. Как насчёт такого?

c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main(void){
  double a=0.85;
  printf("%.60f\n",a);
  return 0;
}
 


где же тут округление? Это просто последствия хранения в виде floating point. Если нужны точные вычисления, в приличных языках для этого есть другие средства, например rationalp

bugmaker(*)(2012-04-14 10:29:43)

Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Уже не срочно.

> где же тут округление? Странный ты - выбросил обе операции округления, которые сам же и советовал, и спрашиваешь где они :)

anonymous(*)(2012-04-14 11:14:51)

avatar
Скрыть

Re:Округление double то нужного кол-ва знаков после запятой. Уже не срочно.

> Странный ты
нет, ты

> выбросил обе операции округления
результат смотрел?

bugmaker(*)(2012-04-14 11:39:46)

Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!