Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Извлечение корня отрицательного числа. / 25 сообщений из 54, страница 1 из 3
07.12.2012, 01:25
    #38068849
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Возможно кто-нибудь подскажет каким образом можно извлечь корень в нечетной степени из отрицательного числа. Функция pow() работает только с положительными числами, а при использовании с отрицательными постоянно возвращает 1.
...
Рейтинг: 0 / 0
07.12.2012, 01:35
    #38068857
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
kab18Возможно кто-нибудь подскажет каким образом можно извлечь корень в нечетной степени из отрицательного числа. Функция pow() работает только с положительными числами, а при использовании с отрицательными постоянно возвращает 1.сделать его положительным. взять корень. а потом результат сделать отрицательным.
...
Рейтинг: 0 / 0
07.12.2012, 01:37
    #38068861
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
kab18Возможно кто-нибудь подскажет каким образом можно извлечь корень в нечетной степени из отрицательного числа.Не бывает такого.

kab18Функция pow() работает только с положительными числами, а при использовании с отрицательными постоянно возвращает 1.Дык! Надо же ей что-то возвращать если человек математику не знает и требует странного.
...
Рейтинг: 0 / 0
07.12.2012, 01:42
    #38068864
Извлечение корня отрицательного числа.
kab18Возможно кто-нибудь подскажет каким образом можно извлечь корень в нечетной степени из отрицательного числа. Функция pow() работает только с положительными числами, а при использовании с отрицательными постоянно возвращает 1.
Математику учите. Используйте комплексное число с иррациональной частью.
...
Рейтинг: 0 / 0
07.12.2012, 01:59
    #38068869
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Вы наверное не внимательно прочитали мое сообщение, я писал о нечетной степени в корне. То есть корень кубический из минус единицы будет равен минус единице. Кое-как нашел необходимый для этого код:
Код: plaintext
1.
Y=(Y1/fabs(Y1))*exp(log(fabs(Y1))*(1.0/3));
...
Рейтинг: 0 / 0
07.12.2012, 04:58
    #38068899
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
2 White Owl:

White Owlkab18Возможно кто-нибудь подскажет каким образом можно извлечь корень в нечетной степени из отрицательного числа.Не бывает такого.
Бывает, например

2 kab18:

Пара замечаний:

kab18
Код: plaintext
1.
Y1/fabs(Y1)



Деление -- не самый лучший способ получить знак числа. Лучше использовать стандартную функцию copysign , она от первого параметра берёт абсолютное значение, а от второго -- знак.

kab18
Код: plaintext
1.
log(fabs(Y1))*(1.0/3)



Если важна точность, то лучше не умножать на одну треть (которая не представима точно типом double), а делить на 3.

С учётом замечаний, я бы написал так:
Код: plaintext
1.
Y = copysign(exp(log(fabs(Y1)) / 3), Y1);



Ну и конкретно для кубического корня есть стандартная функция cbrt (аналог sqrt). В MinGW 4.4.1 она нормально работает с отрицательными числами. Как в остальных компиляторах -- не знаю.
...
Рейтинг: 0 / 0
07.12.2012, 05:11
    #38068902
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
А чем if не подходит?
...
Рейтинг: 0 / 0
07.12.2012, 05:33
    #38068906
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
2 Edd.Dragon:
Edd.DragonА чем if не подходит?
Для получения знака числа? Подходит, но это же ветвление (branch), а для современных процессоров чем меньше ветвлений, тем лучше. А функцию copysign можно реализовать как раз без ветвлений, просто механическое перекладывание битов (для типа double, знак хранится в старшем бите, абсолютное значение -- в оставшихся 63-ёх битах).
...
Рейтинг: 0 / 0
07.12.2012, 13:11
    #38069563
Диклевич Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
а чем второй пост в теме не ответ?
...
Рейтинг: 0 / 0
07.12.2012, 13:17
    #38069586
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Диклевич Александр, тред, батенька. Здесь каждый пишет свои мысли.
Я вообще задумался о методе. Ньютон или Тейлор. Вобщем каждый пишет
как он дышит.
...
Рейтинг: 0 / 0
07.12.2012, 20:01
    #38070446
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Если важна точность, то лучше не умножать на одну треть (которая не представима точно типом double), а делить на 3.

А что, результат деления одного double на 3 всегда и везде точно представим другим double, т.е. не имеет ошибки округления? ЕСли да, тогда в чём проблема посчитать 1.0/3?
...
Рейтинг: 0 / 0
07.12.2012, 20:14
    #38070461
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_nЕсли важна точность, то лучше не умножать на одну треть (которая не представима точно типом double), а делить на 3.

А что, результат деления одного double на 3 всегда и везде точно представим другим double, т.е. не имеет ошибки округления? ЕСли да, тогда в чём проблема посчитать 1.0/3?
В обоих случаях неточно, т.к. каждая операция вносит ошибку.
Но в х*1/3 производятся две операции, а в х/3 - одна. Поэтому точность выше у деления.
...
Рейтинг: 0 / 0
07.12.2012, 21:07
    #38070518
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Анатолий, извините, ну это аргумент из разряда - у нас есть два куска железа и мы знаем что второй кусок содержит на 50 атомов больше чем первый, а значит он тяжелее первого. Но весов, обладающих такой точностью, которая позволила бы уловить эту разницу у нас нет и, более того, законы физики гарантируют что таких весов нельзя создать в принципе... Софистика всё это.
...
Рейтинг: 0 / 0
07.12.2012, 21:11
    #38070523
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_nзаконы физики гарантируют что таких весов нельзя создать в принципе...

И давно? А то ещё сотню лет назад, считалось, что можно взвесить и один отдельный атом...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.12.2012, 21:51
    #38070561
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Взвесить и определить массу - как бы две большие разницы
...
Рейтинг: 0 / 0
07.12.2012, 22:42
    #38070598
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_nзаконы физики гарантируют что таких весов нельзя создать в принципе...
Ой, как интересно! А можно ссылки на соответствующие законы?
...
Рейтинг: 0 / 0
07.12.2012, 23:22
    #38070632
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Ладно, будь по вашему - весы способные обнаружить разницу в 50 атомов создать можно. Да, я утрировал, мне следовало бы сказать что невозможно измерить ни одну физическую величину с абсолютной точностью - любое измерение в принципе имеет погрешность. Возвращаясь к теме топика - мой поинт был в том что на фоне точности вычисления корня нечётной степени из double или что там было ещё - логарифмирование и экспоненциирование, говорить что "если важна точность, то лучше делить на 3 а не умножать на 1/3" - ну это как бы немного неправильно оценивать приоритеты.
...
Рейтинг: 0 / 0
07.12.2012, 23:32
    #38070638
jmp
jmp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_n, деление на 3 - деление на точную константу; умножение на 1/3 - умножение на НЕточную константу. Ещё вопросы?
...
Рейтинг: 0 / 0
08.12.2012, 00:51
    #38070705
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_n, деление на 3 - деление на точную константу; умножение на 1/3 - умножение на НЕточную константу. Ещё вопросы?

К вам? Однозначно нет.
...
Рейтинг: 0 / 0
08.12.2012, 11:31
    #38070820
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_n, вообще-то я также рассуждаю как Анатолий. Каждая операция над double/float вносит некую
абсолютную погрешнось. И чем меньше операций тем точнее результат. Понятное дело что разница - на уровне
младшего разряда или бита. А чтоб нас спор обрёл некую предметную окраску - давайте
сочиним Unit-тест который покажет что сам факт наличия накопления погрешности имеет место.
...
Рейтинг: 0 / 0
09.12.2012, 20:08
    #38071679
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
2 Диклевич Александр:

Диклевич Александра чем второй пост в теме не ответ?
Вполне ответ, спасибо ZyK_BotaN-у, но, возможно, автор вопроса (kab18) хотел увидеть конкретный код.

2 mikhail_n:

mikhail_nЕсли важна точность, то лучше не умножать на одну треть (которая не представима точно типом double), а делить на 3.

А что, результат деления одного double на 3 всегда и везде точно представим другим double, т.е. не имеет ошибки округления?
Я, возможно, не очень удачно использовал слово «точность». Я не имел в виду, что, для типа double, деление на 3 всегда даёт точный результат. Мои слова «Если важна точность» надо понимать как «Если хочется погрешность поменьше».

Например, у меня есть число 1.25 (представимое точно типом double) и я хочу посчитать треть от него. Я могу сделать это двумя способами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
double x = 1.25;

double res_div = x / 3;
printf("res_div = %.25f\n", res_div);

double res_mul = x * (1.0 / 3);
printf("res_mul = %.25f\n", res_mul);


Вывод (MinGW 4.4.1, без оптимизаций):
Код: plaintext
1.
2.
3.
----------------
res_div = 0.4166666666666666900000000
res_mul = 0.4166666666666666300000000
----------------
Теперь забываем про тип double и пишем абстрактные математические числа (некоторые из которых записываются бесконечным количеством цифр в десятичной системе счисления):
Код: plaintext
1.
2.
3.
4.
res_div   = 0.4166666666666666900000000...
err_div   = 0.0000000000000000233333333...
res_exact = 0.4166666666666666666666666...
err_mul   = 0.0000000000000000366666666...
res_mul   = 0.4166666666666666300000000...
То есть оба способа дали неточный результат, но погрешность при делении (err_div = 2.33...·10 -17 ) оказалась меньше, чем погрешность при умножении (err_mul = 3.66...·10 -17 ). То есть, для типа double, деление на 3 может дать более «хороший» (в плане погрешности) результат, чем умножение на 1/3, о чём уже написали Anatoly Moskovsky и jmp.

2 mayton:

maytonКаждая операция над double/float вносит некую абсолютную погрешнось.
Строго говоря, не каждая. Стандарт IEEE 754 требует, что если точный результат арифметической операции представим точно floating-point типом, то именно этот точный результат и должен быть получен, без всякой погрешности, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
double x = 1.5;

double y = x * 3;
assert(y == 4.5); // не должно быть никакой погрешности

double z = y / 3;
assert(z == 1.5); // не должно быть никакой погрешности


Источник: What Every Computer Scientist Should Know About Floating-Point Arithmetic .
The IEEE Standard
...
Formats and Operations
...
Operations

The IEEE standard requires that the result of addition, subtraction, multiplication and division be exactly rounded. That is, the result must be computed exactly and then rounded to the nearest floating-point number (using round to even).
...
Рейтинг: 0 / 0
09.12.2012, 20:25
    #38071681
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
mikhail_nАнатолий, извините, ну это аргумент из разряда - у нас есть два куска железа и мы знаем что второй кусок содержит на 50 атомов больше чем первый, а значит он тяжелее первого. Но весов, обладающих такой точностью, которая позволила бы уловить эту разницу у нас нет и, более того, законы физики гарантируют что таких весов нельзя создать в принципе... Софистика всё это.
Ага, щас.
Тут недавно был топик, где чувак прибавлял по 0.2 начиная с -1.0 и уже к 0 получил видимую погрешность.
Так что все измеряется.
...
Рейтинг: 0 / 0
09.12.2012, 20:39
    #38071685
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Пётр СедовТо есть оба способа дали неточный результат, но погрешность при делении (err_div = 2.33...·10 -17 ) оказалась меньше, чем погрешность при умножении (err_mul = 3.66...·10 -17 ).
Да одинаковая. 17-ый порядок.
...
Рейтинг: 0 / 0
09.12.2012, 21:09
    #38071700
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
2 Edd.Dragon:
Edd.DragonПётр СедовТо есть оба способа дали неточный результат, но погрешность при делении (err_div = 2.33...·10 -17 ) оказалась меньше, чем погрешность при умножении (err_mul = 3.66...·10 -17 ).
Да одинаковая. 17-ый порядок.
Если для достижения конечного результата надо делать одну/две арифметические операции, то действительно разница несущественная. Но если операций надо делать много (какой-нибудь итерационный метод, например), то погрешность будет накапливаться, и в некоторых задачах есть смысл позаботиться о её минимизации.
...
Рейтинг: 0 / 0
09.12.2012, 22:12
    #38071728
Edd.Dragon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Извлечение корня отрицательного числа.
Пётр СедовНо если операций надо делать много (какой-нибудь итерационный метод, например), то погрешность будет накапливаться, и в некоторых задачах есть смысл позаботиться о её минимизации.
В этом случае следует позаботиться об исползовании точных вычислений в ущерб производительности, а не о минимизации погрешности в пару-тройку раз, т.е. об откладывании проблемы на потом (авось ее кому другому придется разгребать). ;)

Т.е. пока эта погрешность не представляет опасности - не важно, делить на 5 или умножать на 0.2. А когда представляет - то тоже в обоих случаях.

P.S.: Вот были где-то более забавные примеры проявления разницы между делением на N и умножением на 1/N. Но не вспомню где :(
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Извлечение корня отрицательного числа. / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]