2009-01-30 13 views
11

पर्ल में, % ऑपरेटर पूर्णांक मानता है। उदाहरण के लिए:आप फ़्लोटिंग पॉइंट नंबरों के div और mod की गणना कैसे करते हैं?

sub foo { 
    my $n1 = shift; 
    my $n2 = shift; 
    print "perl's mod=" . $n1 % $n2, "\n"; 
    my $res = $n1/$n2; 
    my $t = int($res); 
    print "my div=$t", "\n"; 
    $res = $res - $t; 
    $res = $res * $n2; 
    print "my mod=" . $res . "\n\n"; 
} 

foo(3044.952963, 7.1); 
foo(3044.952963, -7.1); 
foo(-3044.952963, 7.1); 
foo(-3044.952963, -7.1); 

देता

perl's mod=6 
my div=428 
my mod=6.15296300000033 

perl's mod=-1 
my div=-428 
my mod=6.15296300000033 

perl's mod=1 
my div=-428 
my mod=-6.15296300000033 

perl's mod=-6 
my div=428 
my mod=-6.15296300000033 

अब के रूप में आप देख सकते हैं, मैं एक "समाधान" के साथ पहले से ही की गणना div और mod के लिए आए हैं। हालांकि, जो मुझे समझ में नहीं आता है, परिणामस्वरूप प्रत्येक तर्क के संकेत का क्या प्रभाव होना चाहिए। div हमेशा सकारात्मक नहीं होगा, n2 की संख्या n1 में फिट बैठती है? इस स्थिति में गणित को कैसे काम करना चाहिए?

उत्तर

8

a = qd + r दिया गया, d के नकारात्मक मानों के लिए शेष की गणना करते समय एक अस्पष्टता है।

उदा .:

अभिव्यक्ति −42 ÷ −5, के रूप में व्यक्त किया जा सकता है या तो के रूप में: −42 = 9×(−5) + 3 या −42 = 8×(−5) + (−2)

तो बाकी तो या तो 3 या -2 है।

अधिक जानकारी के लिए: Wikipedia:Remainder "Inequality satisfied by the remainder"

इसके अलावा, आधुनिक/div में ऋणात्मक संख्याओं के मामले में उत्पादन कार्यान्वयन सॉफ्टवेयर भाषाओं में निर्भर है। Wikipedia: Modulo operation देखें (दाईं ओर तालिका को देखें)

+0

गणितीय पृष्ठभूमि के लिए, [मॉड्यूलर अंकगणितीय] (http://www.math.rutgers.edu/~erowland/modulararithmetic.html) और/या [सार को देखने के (या प्राथमिक) बीजगणित] (http://www.millersville.edu/~bikenaga/abstract-algebra-1/modular-arithmetic/modular-arithmetic.html)। – mctylr

15

शीर्षक एक प्रश्न, शरीर को एक और पूछता है। शीर्षक प्रश्न का उत्तर देने के लिए, जैसे सी में,% ऑपरेटर एक पूर्णांक मॉड्यूलस है, लेकिन एक लाइब्रेरी दिनचर्या "fmod" है जो एक फ़्लोटिंग पॉइंट मॉड्यूलस है।

use POSIX "fmod"; 

sub foo { 
    my $n1 = shift; 
    my $n2 = shift; 
    print "perl's fmod=" . fmod($n1,$n2), "\n"; 
    my $res = $n1/$n2; 
    my $t = int($res); 
    print "my div=$t", "\n"; 
    $res = $res - $t; 
    $res = $res * $n2; 
    print "my mod=" . $res . "\n\n"; 
} 

foo(3044.952963, 7.1); 
foo(3044.952963, -7.1); 
foo(-3044.952963, 7.1); 
foo(-3044.952963, -7.1); 

देता

perl's fmod=6.15296300000033 
my div=428 
my mod=6.15296300000033 

perl's fmod=6.15296300000033 
my div=-428 
my mod=6.15296300000033 

perl's fmod=-6.15296300000033 
my div=-428 
my mod=-6.15296300000033 

perl's fmod=-6.15296300000033 
my div=428 
my mod=-6.15296300000033 
+0

एफएमओडी, एह? मुझे सही साबित होना है। इसे इंगित करने के लिए बहुत बहुत धन्यवाद। – bugmagnet

+0

क्या किसी को इस विकल्प के बारे में पता है कि '-3' के बजाय 'fmod (-23, 10)' रिटर्न' 7' है? – Flimm

+0

अगर यह 0 से कम है तो बस 10 जोड़ें? – ysth

संबंधित मुद्दे