2010-12-10 14 views
9

इस प्रश्न से व्युत्पन्न: (जावा) How does java do modulus calculations with negative numbers?PHP में -13% 64 = -13 कैसा है?

कहीं भी PHP को सकारात्मक 51 लौटने के लिए मजबूर करने के लिए?

अद्यतन
एक विन्यास ठीक करने के लिए स्थापित करने के लिए देख रहे हैं, बजाय कड़ी मेहनत से अनुमान लगा

या bcmath जैसे अन्य गणित समारोह?

अद्यतन
कि जावा जवाब से पूरे, आश्वस्त नहीं के रूप में यह नकारात्मक मापांक के कारण -13+(-64) =?

+1

अपडेट किया गया ... हार्ड-अनुमान विधि का उपयोग किए बिना समाधान की तलाश – ajreal

+2

PHP में गणित कैसे काम करता है यह बदलने के लिए कोई कॉन्फ़िगरेशन सेटिंग नहीं है। यदि वहां था तो शायद यह PHP तोड़ देगा, जो मैं कल्पना करता हूं आंतरिक रूप से – Gareth

+0

की कई गणनाओं का उपयोग करता है यह एक इच्छित एल्गोरिदम नहीं है। आश्चर्यजनक रूप से पायथन और पर्ल इसे स्वीकार करते हैं, लेकिन PHP नहीं करता है। एक कामकाज का प्रयोग करें। बीटीडब्ल्यू, 'एफएमओडी() 'और' बीसीएमओडी() 'और' gmp_mod() 'या तो नहीं। – mario

उत्तर

5

से जुड़ा हुआ में सुझाव उपलब्ध है, तो आप उपयोग कर सकते हैं gmp_mod

गणना करता है n सापेक्ष डी का प्रयोग करें। नतीजा हमेशा गैर-नकारात्मक होता है, डी का संकेत अनदेखा किया जाता है।

उदाहरण:

echo gmp_strval(gmp_mod('-13', '64')); // 51 

नोट n और d जीएमपी संख्या संसाधनों या संख्यात्मक तार होना जरूरी है। और कुछ work¹ नहीं होंगे

echo gmp_strval(gmp_mod(-13, 64)); 
echo gmp_mod(-13, 64); 

होगा दोनों वापसी -51 बजाय (which is a bug)।

¹इस codepad में ऊपर चल रहा है, सभी तीन मामलों में 51 का उत्पादन करेगा। यह मेरी विकास मशीन पर ऐसा नहीं करेगा।

+0

उचित लगता है – ajreal

12

वैसे भी नहीं ले करता है, आप जिस पोस्ट संदर्भित पहले से ही सही जवाब दिया:

$r = $x % $n; 
if ($r < 0) 
{ 
    $r += abs($n); 
} 

जहां $ x = -13 और $ n = 64.

+0

क्या मॉड्यूलस के लिए कॉन्फ़िगरेशन है, इसके बजाय स्वयं को अनुमान लगाएं? – ajreal

+1

कोई अनुमान लगाने में कोई अनुमान नहीं है, बस गणना करें कि कौन (वाह) आप पहले से ही कुछ कर रहे हैं। – Gareth

+1

'if' को प्राथमिक रूप से' while' होना चाहिए। – mario

0

PHP manual कहता है कि

मॉड्यूलस ऑपरेटर% का परिणाम लाभांश के समान संकेत है - यानी, $% $ b का परिणाम $ ए के समान संकेत होगा। उदाहरण के लिए

इसलिए यह कॉन्फ़िगर करने योग्य नहीं है। विकल्पों सवाल आप हैं GMP

3

मॉड्यूलो ऑपरेशन को किसी अन्य संख्या के विभाजन का शेष भाग मिलना चाहिए। लेकिन सबसे मुख्यधारा प्रोग्रामिंग भाषाओं में सख्ती से बोलना मॉड्यूल ऑपरेशन खराब होने पर लाभांश या/और divisor नकारात्मक हैं। इसमें PHP, Perl, Python, Java, C, C++, etc.

क्यों मैं खराब कहता हूं? क्योंकि गणितीय परिभाषा के अनुसार, a remainder must be zero or positive

सरल उपाय मामले अपने आप को संभालने के लिए है: | भाजक

if r < 0 then r = r + |divisor|; 

| divisor का पूर्ण मूल्य है।

एक और समाधान लाइब्रेरी का उपयोग करना है (जैसा कि @ गॉर्डन ने इंगित किया है)। हालांकि मैं इस तरह के एक साधारण मामले को संभालने के लिए पुस्तकालय का उपयोग नहीं करता।

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