Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Почему функция fmod из стандартной библиотеки (реализация MS VS 2013) возвращает 0.2 при входных параметрах 1.0 и 0.2? Несмотря на то, что MSDN сообщает: https://msdn.microsoft.com/en-us/library/20dckbeh%28v=vs.120%29.aspx]The fmod function calculates the floating-point remainder f of x / y such that x = i * y + f, where i is an integer, f has the same sign as x, and the absolute value of f is less than the absolute value of y . Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 14:11 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NETвозвращает 0.2 при входных параметрах 1.0 и 0.2? Потому что ты выводишь мало цифр после запятой. То, что она возвращает не совсем 0.2. Да и то, на что она делит, собственно говоря, тоже. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 14:44 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET, Число 0.2 точно нельзя представить в виде float/double. Поэтому в зависимости от реализации будет выбрано либо чуть меньшее либо чуть большее число. А поскольку fmod обычно реализован с помощью итеративных вычитаний (алгоритм Евклида), а не просто делением с усечением до целого, то вполне возможны разные результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 15:31 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Да, я понял. Если вывести больше цифр, то получится 1.999999 и т. д. Однако, 0.2 * 5 все же равно 1. Почему в этом случае 0.2 трактуется как 0.2 в точности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 17:49 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET...Почему в этом случае 0.2 трактуется как 0.2 в точности? Тебя смущает, что одно неточное представление 0.2 10 совпадает другим, сформированным точно так же, неточным представлением 0.2 10 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 17:54 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
чччД.NET...Почему в этом случае 0.2 трактуется как 0.2 в точности? Тебя смущает, что одно неточное представление 0.2 10 совпадает другим, сформированным точно так же, неточным представлением 0.2 10 ? Если остаток от деления 1 на 0.2 10 даёт не 0, а 1.9999... , то значит 0.2 2 > 0.2, почему же тогда 0.2 10 * 5 = 1, а не больше? Вообще непонятно зачем нужна функция нахождения остатка от деления для вещественных чисел, тем более что она возвращает такие неожиданные значения. Почему не ограничится целыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 19:15 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
то, что .2 * 5 == 1 не означает что .2 это именно .2 а не какое-нибудь другое число.. эта арифметика так и называется - плавающая :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2016, 20:30 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET...почему же тогда... Потому что ты не знаешь, как устроены double-precision floating-point format числа. Разбирайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 01:13 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NETОднако, 0.2 * 5 все же равно 1. Почему в этом случае 0.2 трактуется как 0.2 в точности?Число 0.2 записывается бесконечным количеством цифр в двоичной системе счисления: 0.2 10 = 0.00110011001100110011... 2 (маленькие числа внизу -- это основание системы счисления) Но в мантиссе типа double только 53 двоичных цифры, поэтому: Число 0.2 не попадает в точности ни в одно double-число, оно попадает между двумя double-числами, x1 и x2: Код: plaintext 1. 0.2 ближе к x2, чем к x1, поэтому именно x2 выбирается для представления 0.2 (можете проверить с помощью printf("0.2 ≈ %.60f\n", 0.2)). Число y = 5 * x2 не попадает в точности ни в одно double-число, оно попадает между двумя double-числами, z1 и z2: Код: plaintext 1. 2. y ближе к z1, чем к z2, поэтому именно z1 выбирается в качестве результата умножения. Вот так и получается, что неточное 0.2 (x2) умножаем на 5, и получаем точную единицу (z1). Вообще, floating point арифметика работает так, как будто сначала вычисляется результат с идеальной точностью, а потом: * Если идеальный результат попадает в точности в какое-нибудь double-число, то оно и берётся в качестве double-результата. Поэтому например работа с целыми числами в достаточно большом диапазоне идёт без погрешности: Код: plaintext 1. 2. 3. * Если идеальный результат попадает между двумя double-числами, то ближайшее из них выбирается в качестве double-результата. Если идеальный результат ровно посередине между двумя double-числами, то выбирается то, у которого младшая двоичная цифра -- 0 (round to even). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 05:33 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET, а нафига тебе остаток от деления нецелых чисел вообще? смысл в этом какой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 07:22 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, Спасибо, за подробный ответ. Т. е. если вкратце, то ошибка в представлении 0.2 настолько мала, что да же будучи умноженная на 5 её не хватает на то чтобы изменить последний разряд результата умножения. MasterZiv, Несколькими постами выше я сам задавался подобным вопросом. Зачем нужен остаток от деления нецелых? Мне пока незачем. Я изучаю язык. Но чисто гипотетически, если надо разлить бочку воды ёмкости 87.9 литра по вёдрам ёмкостью 9.7 литра и узнать сколько останется, то почему бы и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 10:40 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NETесли надо разлить бочку воды ёмкости 87.9 литра по вёдрам ёмкостью 9.7 литра и узнать сколько останется, то почему бы и нет. Деньги не вздумай так считать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 11:06 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NETНесколькими постами выше я сам задавался подобным вопросом. Зачем нужен остаток от деления нецелых? Мне пока незачем. Я изучаю язык. Ага, и ты начал именно с fmod ... Да я всё жизнь (не, пол) этот язык изучаю, но никогда про эту функцию не слышал даже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 12:09 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NETНо чисто гипотетически, если надо разлить бочку воды ёмкости 87.9 литра по вёдрам ёмкостью 9.7 литра и узнать сколько останется, то почему бы и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 12:12 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Тут смотря в какую сторону считать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. результатup from 0.000000e+00 2.000000e-01 => 3FC999999999999A 4.000000e-01 => 3FD999999999999A 6.000000e-01 => 3FE3333333333334 8.000000e-01 => 3FE999999999999A 1.000000e+00 => 3FF0000000000000 down from 1.000000e+00 8.000000e-01 => 3FE999999999999A 6.000000e-01 => 3FE3333333333334 4.000000e-01 => 3FD999999999999B 2.000000e-01 => 3FC999999999999C 5.551115e-17 => 3C90000000000000 При уменьшении ошибка накапливается быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 12:33 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
MasterZiv.NETНесколькими постами выше я сам задавался подобным вопросом. Зачем нужен остаток от деления нецелых? Мне пока незачем. Я изучаю язык. Ага, и ты начал именно с fmod ... Да я всё жизнь (не, пол) этот язык изучаю, но никогда про эту функцию не слышал даже. Если говорить не о языке C вообще, а только о функциях стандартной библиотеки, то начал я, если вам интересно, с функций объявленных в заголовочном файле ctype.h. Но там все более менее понятно, так что необходимости тревожить уважаемое сообщество не возникло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 17:53 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET, для старожилов этого форума, обсуждение дефекта вычислений с IEEE 754 давно уже набило оскомину. И я понимаю досаду с которой мы восприняли твой вопрос. Просто ответ на него не лежит в плоскости того как работает fmod() которую я тоже никогда не использовал. Подозреваю что ее определение тривиально. Но тебя бьют и кусают не за fmod а за незнания fundamentals. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 18:21 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
.NET, я немного пропустил в коде 19013898 , начало было такое Код: plaintext 1. 2. 3. 4. 5. результат0.2 res < denum delta: 5.55112e-17 ожидаемо что чуть не сошлось в 17 разряде. Потому что точность double 15-16 десятичных разрядов. Надо знать основы. Вычисления типов с плавающей запятой имеют погрешности, надо это учитывать. PS Про fmod() тоже не знал, бесполезная функция в связи с выше описанным. PPS Изопропил, деньги в double считать можно. 15 десятичных разрядов достаточно чтобы посчитать до 100 триллионов по копейке. ЕМНИП уже писал именно тебе о том что погрешности вылезают если уйти от сложения и умножения на целое, а если уйти они все равно вылезают хоть с double хоть с int/decimal/money. Тут главное прямое сравнение не использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 19:18 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Usman.NET, Using Boost.Multiprecision Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Вывод: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 20:54 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Без double : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2016, 21:22 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Dima T Код: plaintext 1. 2. 3. В C99 можно выводить floating point числа без округления, через %a. Мантисса пишется 16-ричными цифрами, потом буква p, потом степень двойки. Код: plaintext 1. 2. вывод: Код: sql 1. 2. 1.999999999999a 16 *2 -3 = 0001.1001'1001'1001'1001'1001'1001'1001'1001'1001'1001'1001'1001'1010 2 *2 -3 = x2 (из моего первого сообщения) Usman Using Boost.Multiprecision Чем это лучше/хуже GMP ? MasterZivДа я всё жизнь (не, пол) этот язык изучаю,Задумался, сколько лет MasterZiv-у. Сам-то он не помнит . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 02:54 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Пётр СедовUsman Using Boost.Multiprecision Чем это лучше/хуже GMP ?Нужно сравнить. Будем ждать примеров на GMP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 03:04 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Я после 26 тоже перестал сообщать свой возраст. Наверное внутренний философ заговорил. По поводу количества лет ковыряния той или иной науки. Мне кажется логистическая кривая наиболее полно отражает суть вопроса. Пик твоей активности уже пройден и по сути ты уже не учишся а как эксперт таскаешь в голове кучу ненужного мусора типа событий, исключений, забавных справочных данных или фактов, сведений о релизах и патчах и версиях ПО. Это дает тебе плюсик но уже не такой большой как в середине обучения. Поэтому я-бы не спрашивал сколько лет ты занят долбёжкой того или иного языка, а где ты себя ощущаешь в развитии на этой кривой. По чесноку. Можно даже дать два ответа. Один - для аудитории а другой для себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 08:43 |
|
||
|
fmod(1.0, 0.2)=0.2
|
|||
|---|---|---|---|
|
#18+
Марк, все эти кривые очень индивидуальны. У людей, занятых интеллектуальным трудом (а хорошие программисты этим и занимаются (не все программисты - хорошие, конечно)), всё это происходит совершенно по другому, чем у людей работающих на обычной скучной и нудной работе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 09:06 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39207917&tid=2018559]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 190ms |

| 0 / 0 |
