русский
Germany.ruForen → Архив Досок→ Linux & Co

Mod(x,y) modulo ne mogu pos4itat:(

151  
genocidee посетитель26.10.04 12:37
genocidee
26.10.04 12:37 
Надо посчитать остаток от деления 2х очень длинних чисел - для этого я использую long double и для вычисления остатка функцию fmodl(long double,long double) но проблема в том что ета фукция выдает постоянно остаток =0. это происходит наверное из-за плавающей запятои (округляется само) что делать даже не знаю, хелп, 4исло вот:
15241578791091755218999
делить надо сна4ала на 2, потом на 3 и т.д. (разложить на простые)
Is this the real world, Neo?
Is this the real world, Neo?
#1 
Chipolino знакомое лицо26.10.04 15:12
NEW 26.10.04 15:12 
in Antwort genocidee 26.10.04 12:37
Интересно,у меня при делении на два получается отрицательный результат
Число взял как long double , я слышал что возникают проблемы(в си) в операциях над большими числами,но не такие же.
#2 
genocidee посетитель26.10.04 15:36
genocidee
NEW 26.10.04 15:36 
in Antwort Chipolino 26.10.04 15:12, Zuletzt geändert 26.10.04 15:42 (genocidee)
2 Chipolino
Попробуй так:
#include <math.h>
printf("%llf\n",fmodl( 15241578791091755218999.0, 2.0))
-----------------------
и пролинкуй mathlib:
gcc *.c -o prg.exe -lm
--------------------------------
дада с делением больших чисел у меня в С огромнейшый касяк - делить вооше не может - порой доходит до такого, что делит тока до запятой, после запяпятои ,000000 выдает, почему не пойму (это тока при больших числах 10-15 цыфр)
а умножает нормально, кто знает, хелп плиз!
Is this the real world, Neo?
#3 
Gaidzin завсегдатай26.10.04 16:14
Gaidzin
NEW 26.10.04 16:14 
in Antwort genocidee 26.10.04 12:37
Есть такая известная книга Numerical Recipes (в вариантах C, FORTRAN, C++)
http://www.nr.com
Доступна по главам
http://www.library.cornell.edu/nr/cbookcpdf.html
Конкретно про большие числа
http://www.library.cornell.edu/nr/bookcpdf/c20-6.pdf
#4 
genocidee посетитель26.10.04 16:25
genocidee
NEW 26.10.04 16:25 
in Antwort Gaidzin 26.10.04 16:14
Пасиба, пошел читать ;)
Is this the real world, Neo?
Is this the real world, Neo?
#5 
Russman местный житель26.10.04 16:56
Russman
NEW 26.10.04 16:56 
in Antwort genocidee 26.10.04 12:37, Zuletzt geändert 26.10.04 16:58 (Russman)
Переглючивает гцц, не то число идет в переменную.
#include <stdio.h>
#include <math.h>
void main(){
long double number = 15241578791091755218999.0;
printf ("%Lf\n", number,0);
}
gcc -Wall -lm math.c
math.c:4: warning: return type of `main' is not `int'
a.out
15241578791091755286528.000000
---
This program requires Volkov Commander . (2:460/66.13)
#6 
genocidee посетитель26.10.04 17:12
genocidee
NEW 26.10.04 17:12 
in Antwort Russman 26.10.04 16:56
согласен, хмм тока вот почему?? странно блин. Ландо попробую представить число как массив char и буду химичить с ним...стрелятся млин..
Is this the real world, Neo?
Is this the real world, Neo?
#7 
Gaidzin завсегдатай26.10.04 22:41
Gaidzin
NEW 26.10.04 22:41 
in Antwort genocidee 26.10.04 17:12
Вот библиотека для чисел с неограниченной (практически) точностью на C
http://swox.com/gmp/
Это на C++
http://www.ginac.de/CLN/index_normal.html
Это немного не в тему, но к слову пришлось: библиотека символьной математики на C++
http://www.ginac.de/
#8 
Russman местный житель26.10.04 23:47
Russman
NEW 26.10.04 23:47 
in Antwort Gaidzin 26.10.04 22:41
Какое однако обьяснение такомы странному поведению? Товарищи программисты, не дайте помереть темным!
---
Пpоект 21 века! Эстонцы пеpеписывают китайцев.
#9 
katran76 посетитель27.10.04 09:10
NEW 27.10.04 09:10 
in Antwort Russman 26.10.04 23:47, Zuletzt geändert 27.10.04 09:12 (katran76)
Не умирай.
Действительные числа (float) хранятся в виде (упрощенно говоря)
sign * x * 2^y,
http://www.psc.edu/general/software/packages/ieee/ieee.html
http://en.wikipedia.org/wiki/IEEE_floating-point_standard
где
sign= 1 or sign=-1
0.0<x<1.0
y - integer
При этом число значащих цифр после запятой определяется числом бит
в представлении x. Т.е. число 15241578791091755218999=1.5241578791091755e 22
хранится в RAM в виде (64 bits)
0 10001001000 1 .1001110100011111101100101011101010010011100001111110
= 1 * 1.6137649255283857 * 2^73
http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
где число цифр после запятой ограничено!!!
Есть ещё пара тонкостей, но идея приведена выше.
#10 
Russman местный житель27.10.04 13:00
Russman
NEW 27.10.04 13:00 
in Antwort katran76 27.10.04 09:10
Однако это не обьясняет, почему дабл не может правильно хранить переменные которые намного меньше максимального значения. Это баг гцц или в програмке ошибки?
---
Скудность мысли порождает легионы единомышленников.
#11 
katran76 посетитель27.10.04 13:49
NEW 27.10.04 13:49 
in Antwort Russman 27.10.04 13:00
Как раз это и обьясняет.
Любое число хранится в формате с ОГРАНИЧЕННЫМ числом десятичных
знаков после запятой.
Т.е. к примеру если это число равно 3, то
1.0000 не отличим от 1.0001 (вернее 1.000 может быть любым от 0.999 до 1.001).
Однако для числа 1.0000*10^20 ошибка представления составляет уже не
0.001 (три знака после запятой) а
0.001*10^20=10^17
(т.е. 1.000*10^20 определяет число от 0.999*10^20 до 1.001*10^20).
Так понятней?
Для числа x=2.34*10^300 при точности хранения 20 десятичных знаков
погрешность представления 1*10^280.
#12 
Russman местный житель27.10.04 14:30
Russman
NEW 27.10.04 14:30 
in Antwort katran76 27.10.04 13:49
В вопрос вьехал. Одной иллюзией меньше. Пошел переписывать расчетные программы. :-)
---
Казад Дyма pаспyщена. Моpией pyководит ОpкКомитет.
#13