writef() का उपयोग करके, मैं फ़्लोटिंग-पॉइंट नंबर की आउटपुट परिशुद्धता को नियंत्रित कर सकता हूं, उदाहरण के लिए:

writef( "%20.15dr\n", 1.0 / 3.0 );      // 0.333333333333333

लेकिन अगर मैं सुविधा के लिए writeln() का उपयोग करता हूं, तो संख्या 6 अंकों के साथ आउटपुट होती है:

writeln( 1.0 / 3.0 );                   // 0.333333

क्या writeln().. के लिए फ़्लोटिंग-पॉइंट नंबरों की डिफ़ॉल्ट आउटपुट परिशुद्धता को नियंत्रित करने का कोई तरीका है? (उदाहरण के लिए, कुछ पर्यावरण चर के माध्यम से?)

तुलना के लिए, कुछ भाषाएं डिफ़ॉल्ट रूप से 15 अंकों और कुछ 6 अंकों का उत्पादन करती हैं, इसलिए परिणाम भाषाओं (या संकलक) के आधार पर भिन्न होता है।

# python2
print 1.0 / 3.0      # 0.333333333333
# python3
print( 1.0 / 3.0 )   # 0.3333333333333333
# julia
println( 1.0 / 3.0 )   # 0.3333333333333333
# gfortran
print *, 1.0d0 / 3.0d0   # 0.33333333333333331
# swift
print( 1.0 / 3.0 )       # 0.333333333333333
# nim
echo( 1.0 / 3.0 )       # 0.3333333333333333
# g++
cout << 1.0 / 3.0 << endl;   # 0.333333
# d (dmd)
writeln( 1.0 / 3.0 );      # 0.333333
5
roygvib 23 जिंदा 2019, 19:51

2 जवाब

सबसे बढ़िया उत्तर

iostyle और _set_style() :

writeln(100.0/3.0);   // 33.3333

stdout.lock();
stdout._set_style(new iostyle(precision=10));
stdout.unlock();

writeln(100.0/3.0);   // 33.33333333

आप अन्य चीजें भी new iostyle() को पास कर सकते हैं, उदाहरण के लिए:

precision=10, realfmt=0          // like %.10g in C:  33.33333333      (default)
precision=10, realfmt=1          // like %.10f in C:  33.3333333333
precision=10, realfmt=2          // like %.10e in C:  3.3333333333e+01
5
Vass 23 जिंदा 2019, 21:29

हाँ वहाँ है। चैपल में, I/O चैनलों पर किया जाता है। प्रत्येक चैनल की एक I/O शैली होती है (iostyle प्रकार के रिकॉर्ड द्वारा प्रदर्शित) जो निर्दिष्ट करती है कि उस चैनल पर मान कैसे मुद्रित किए जाते हैं यदि रीड/राइट कॉल में ही अधिक विशिष्ट शैली प्रदान नहीं की जाती है। writeln() को कॉल अनिवार्य रूप से stdout.writeln() को कॉल है जहां stdout एक चैनल है जिसका आउटपुट कंसोल में दिखाई देता है।

निम्नलिखित उदाहरण दिखाता है कि stdout की आई / ओ शैली बदलने के लिए ( यह ऑनलाइन का प्रयास करें ):

// print to stdout using its default style                                                
writeln( 1.0 / 3.0 );

// create a new IO style with a precision of 15                                   
var style = new iostyle(precision=15);

// change stdout to use this new style                                          
stdout._set_style(style);

// print using the new style                                                    
writeln( 1.0 / 3.0 );

// restore the default style and print once more                                
stdout._set_style(defaultIOStyle());
writeln( 1.0 / 3.0 );

जहां आउटपुट है:

0.333333
0.333333333333333
0.333333

ध्यान दें कि किसी चैनल की शैली को पहले लॉक किए बिना समानांतर कोड में बदलना सुरक्षित नहीं है। चूंकि ऊपर दिया गया उदाहरण पूरी तरह से सीरियल है, यह ठीक है, लेकिन एक बड़े, संभावित समानांतर, प्रोग्राम के संदर्भ में, बेहतर तरीका यह होगा कि चैनल की शैली को सेट करने से पहले उसे लॉक कर दिया जाए, जो इस प्रकार है (की कोशिश करो यह ऑनलाइन):

// print to stdout using its default style                                                
writeln( 1.0 / 3.0 );

// create a new IO style with a precision of 15                                   
var style = new iostyle(precision=15);

// change stdout to use this new style                                          
stdout.lock();
stdout._set_style(style);
stdout.unlock();

// print using the new style                                                    
writeln( 1.0 / 3.0 );

// restore the default style and print once more                                
stdout.lock();
stdout._set_style(defaultIOStyle());
stdout.unlock();
writeln( 1.0 / 3.0 );

चैपल के ऑनलाइन दस्तावेज़ में I/O स्टाइल के बारे में अधिक जानकारी है। , iostyle रिकॉर्ड के क्षेत्र , और चैनलों को लॉक करना

5
Brad 23 जिंदा 2019, 21:49