LINUX.ORG.RU
ФорумTalks

Что вы думаете о таком методе деления?


0

1

Когда делят два целых числа переводя их в вещественные, а потом обратно в целые?

Речь идет о реализации команды деления в процессоре.

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 1)

думаю, что из-за того, что делят в убогом языке

derlafff ★★★★★
()
Ответ на: комментарий от Hrenomoto

> а если нацело не делится?

деление с остатком

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от derlafff

В данном случае речь идет о реализации команды деления в процессоре

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

никак — тоже самое, что и интовое деление:

1024 / 49 = 20

1024.0 / 49.0 = (int)20.89795918367346938775 = 20

поддерживаю segfault — производительность сильно падает, особенно на микроконтоллерах, а профита — ноль целых, ноль десятых

beastie ★★★★★
()
Ответ на: комментарий от vkos

> Не сказано же, как обратно в целое переводится.

под делением целых чисел обычно понимается деление с остатком

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

и что? ну, добавь пятьдесят нулей, будет тоже самое.

beastie ★★★★★
()
Ответ на: комментарий от cvs-255

На больших эффективнее:

#! /usr/bin/env python3

for i in range(1, 2**20):
        2**102/(2**55-2**33+34435)
$ time ./tst1.py 

real    0m0.447s
user    0m0.440s
sys     0m0.000s
#! /usr/bin/env python3

for i in range(1, 2**20):
        2**102//(2**55-2**33+34435)
$ time ./tst2.py 

real    0m0.597s
user    0m0.590s
sys     0m0.000s

vkos ★★
()

в процессоре используют команды div или сдвиги. на входе два целых, на выходе частное и остаток. если компилятор компиляет как-то иначе, выбросить и поискать другой

chg ★★★★★
()
Ответ на: комментарий от vkos

исходя из использованных тобой 2**102 там вообще bignum, а не float с long'ом. на отрезание остатка уходит соответственно больше времени.

beastie ★★★★★
()

>Что вы думаете о таком методе деления?

не вижу проблемы. если скорость от этого повышается.

dikiy ★★☆☆☆
()
Ответ на: комментарий от cvs-255

>Как у такого метода с точностью, когда числа большие?

все нормально должно быть. Так как деление - это «хорошая» операция. Она уменьшает «ошибку ввода».

dikiy ★★☆☆☆
()
Ответ на: комментарий от cvs-255

>Как у такого метода с точностью, когда числа большие?

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

dikiy ★★☆☆☆
()
Ответ на: комментарий от beastie

>производительность сильно падает, особенно на микроконтоллерах, а профита — ноль целых, ноль десятых

В прошлом веке сопроцессор Intel 8087 использовался как самостоятельный микроконтроллер в компактных «спец.железяках» для нелинейного управления.

quickquest ★★★★★
()
Ответ на: комментарий от cvs-255

>Как у такого метода с точностью, когда числа большие?

вот тебе пример. даже больших чисел не надо:

если ты выберешь функцию round, как «базу», то тогда такой пример не заработает:

делишь 9 на 2. получаешь от сопроцессора 0.45e1, round отдает 5. А получаешь 0.44999999e1, round отдаст 4.

А выберешь функцию floor, как «базу», то тогда при делении 10/1 можешь получить 0.99999999e1, с понятным результатом :)

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

> все нормально должно быть.

double - 64 бита всего. Из них 52 - мантисса, 11 - степень и знак

Это значит, что точность деления чисел от 2^53 до 2^64-1 будет ниже, чем при использовании int

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

>> все нормально должно быть.

double - 64 бита всего. Из них 52 - мантисса, 11 - степень и знак

Это значит, что точность деления чисел от 2^53 до 2^64-1 будет ниже, чем при использовании int

хых. Я думал, что данный очевидный «минус» этого метода был уже учтен.

Но даже если бы это было не так, то есть мантисса была бы тоже 64 бита, как и int. То трабл был бы все равно. И как его победить, так с наскоку не видно (см. мой предыдущий пост).

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

> хых. Я думал, что данный очевидный «минус» этого метода был уже учтен.

А теперь представь, что у процессора команда деления целых чисел именно так и поступает!

В данном случае речь идет о мцст-шном r500, который спарк. И это, блин, ставили на ракеты!

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

>В данном случае речь идет о мцст-шном r500, который спарк. И это, блин, ставили на ракеты!

Ну и как в r500 решили данную проблему? Ведь ошибка в целочисленном делении не может не вылезти даже на самых ранних этапах тестирования.

либо точность при целочисленном делении так же должна быть по паспорту 52 бита (ну или сколько там). Но в данном случае мне интересно, как решена проблема в принципе (см. пост выше).

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Об этом они умалчивают. Зато пишут о 9 битах результата за такт.

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

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

>Об этом они умалчивают. Зато пишут о 9 битах результата за такт.

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

не может быть такого. Такой баг просто не может остатьяс не замеченным. Любая ОС будет зависать практически сразу.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

> Такой баг просто не может остатьяс не замеченным.

остаться незамеченным не может. Остаться неисправленным вполне.

А ОС как правило не делит числа порядка 2^53

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Они пишут, что на новых процессорах вернулись к классической схеме делителя целых чисел.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

>>остаться незамеченным не может. Остаться неисправленным вполне.

А ОС как правило не делит числа порядка 2^53

ну а как быть с приведенным мной примером, где маленькие числа?

dikiy ★★☆☆☆
()
Ответ на: комментарий от cvs-255

глянь сюда:

google SRT-алгоритм деление

третья ссылка сверху

dikiy ★★☆☆☆
()
Ответ на: комментарий от cvs-255

>А в linux-ядре используется ли деление не на степени двойки?

не вижу причин, почему бы не быть делению на 3. или 9/2.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Надо будет проверить. Вставить детектор в код виртуальной машины

cvs-255 ★★★★★
() автор топика

>Что вы думаете о таком методе деления?

Когда делят два целых числа переводя их в вещественные, а потом обратно в целые?

Ты пытаешься изобрести паскалевские операторы целочисленного деления div и mod. Выброси из техпроцесса перевод в вещественное число и у тебя всё получится!

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

>Ты пытаешься изобрести паскалевские операторы целочисленного деления div и mod. Выброси из техпроцесса перевод в вещественное число и у тебя всё получится!

ты тред хоть почитай немного.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

>ты тред хоть почитай немного.

Если в кратце, что там гениального? А то читал и полезности не обнаружил, лишь небольшое сомнительное ускорение одной операции за счёт дополнительного разогрева камня и увеличенного энергопотребления. Несколькими постами выше описывалось что камень выдаёт при целочисленном делении, в x86_64 всё уже есть без костылей.

Napilnik ★★★★★
()

Только сейчас про процессор прочитал. Так вот, на x86 у div делимое в два раза длиннее делителя, частного и остатка. Так что поделить на еденицу не выйдет.

vkos ★★
()
Ответ на: комментарий от vkos

> Исполни в питоне, посмотри результат.

Исполнил, но предварительно подправив. ТС говорил про _приведение_, а не _округление_. Так что:

[code]>>> 2/3 == int(2.0/3.0) True[/code]

segfault ★★★★★
()
Ответ на: комментарий от cvs-255

> Как у такого метода с точностью, когда числа большие?

Главное, чтоб битность дробного была где-то в полтора раза больше целого. Хотя, не факт, что в противном случае метод обязательно сфейлит.

segfault ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.