185. Modulo works on floats!

רובנו תכנתנו בעבר בשפת C.

לכן כאשר עברנו לשפת C# סביר להניח שהנחנו שאנחנו מכירים את כל הפעולות האלמנטאריות על פרימיטיביים.

ההתנהגות באמת זהה ברוב האופרטורים, אלא שיש משהו שכנראה לא שמנו לב אליו:

אופרטור המודולו (%) עובד על floatים!

לדוגמה:

1
2
3
4
5
double pi = Math.PI; // 3.14159265...
double piFraction = pi%1; // 0.14159265...
double anotherFraction = pi%2; // 1.14159265...

ההגדרה של מודולו (לa וb חיוביים) היא כהלן:

$ a \% b=\begin{cases} a & a<b\\ \left(a-b\right) \%b & a\ge b \end{cases} $

כלומר הפעולה מחזירה לנו את האיבר הראשון שקטן מb וההפרש בינו לa הוא כפולה שלמה של b.

הדבר שימושי בעיקר לחישובים דברים מחזוריים, למשל חישוב סינוס של מספר – מאחר וסינוס פונקציה מחזורית עם מחזור $ 2 \pi $ אפשר לעשות משהו כזה:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static double Sin(double arg, int numOfTerms)
{
arg = arg%(2*Math.PI);
int currentFactorial = 1;
int minus = 1;
double currentPower = arg;
double result = 0;
for (int i = 2; i <= numOfTerms; i+=2)
{
result += minus * currentPower / currentFactorial;
currentFactorial *= i * (i + 1);
currentPower *= arg * arg;
minus *= -1;
}
return result;
}

זה מחשב את הסינוס גם כאשר הארגומנט הוא גדול מאוד.

סופ"ש צף טוב

שתף