Thursday, November 11, 2010

ತೇಲುವ ಚುಕ್ಕಿ

ತೇಲುವ ಚುಕ್ಕಿಯ ಅಂಕೆ (floating point number) ಅಂದರೆ  ಏನು? ಹಾಗೆ  ಯಾಕೆ ಕರೆಯುತ್ತಾರೆ?
ಅದನ್ನೆಲ್ಲ ಮುಂದಿನ ಬರಹದಲ್ಲಿ ತಿಳಿಸುತ್ತೇನೆ. ಆದರೆ, ಸದ್ಯಕ್ಕೆ ಇಶ್ಟು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಿ. ನನ್ನಿಯಂಕೆ(real number)ಗಳನ್ನು ಎಣಿ(computer)ಯಲ್ಲಿ ಉಳಿಸಿ ಇಟ್ಟುಕೊಳ್ಳುವ ಒಂದು ಮಾರಾಳುತನ (representation) ಇದು. ಗಿರಕು ಚುಕ್ಕಿಯ ಮಾರಾಳುತನ(fixed point representation)ವೂ ಇದೆ. ಆದರೆ ಇದು ಹೆಚ್ಚು ಕಟ್ಟುನಿಟ್ಟಾ(precise)ಗಿದ್ದರೂ ತುಂಬಾ ಎಡೆ(space) ಹಿಡಿಸುತ್ತದೆ. ಹಾಗಾಗಿ ಈ ಮಾರಾಳುತನ(representation)ವನ್ನು ಈಗಿನ ಎಣಿಗಳು ಬಳಸುವುದಿಲ್ಲ. ತೇಲುವ ಚುಕ್ಕಿಯ ಮಾರಾಳುತನವನ್ನೇ ಬಳಸುತ್ತವೆ.

ಸಿ ನುಡಿಯಲ್ಲಿ ಮೂರು ಬಗೆಯ ತೇಲುವ ಚುಕ್ಕಿಯ ಅಂಕೆಗಳು ಇವೆ: float, double, long double. floatಗಿಂತ double ಅಂಕೆಯ ಕಟ್ಟುನಿಟ್ಟುತನ (precision) ಇಮ್ಮಡಿ. ಅದಕ್ಕೂ ಹೆಚ್ಚಿನ ಕಟ್ಟುನಿಟ್ಟುತನ ಅಂದರೆ long doubleದು. ಇವುಗಳ ಹರವು(range) ಎಷ್ಟು, ಮತ್ತು ಕಟ್ಟುನಿಟ್ಟುತನ ಎಷ್ಟು ಅಂತ ಮುಂದೆ ಹೇಳುತ್ತೇನೆ.

ಹಾಗಿದ್ದರೆ ನಮ್ಮ ಹಿಂದಿನ ಹಮ್ಮಿ(program)ನಲ್ಲಿ int ಬದಲಾಗಿ ಈ ಯಾವುದಾದರೂ ತೇಲುವ ಚುಕ್ಕಿಯ ಅಂಕೆಯನ್ನು ಬಳಸಬಹುದು. float ಅನ್ನು ಬಳಸಿ ನೋಡೋಣ.

#include<stdio.h>


main() {
   float km;
   int mile;
   scanf("%d",&mile);
   km = 1.61 * mile;
   printf("%f",km);
}

ಒಟ್ಟಿಸಿ (compile), ಎಸಗಿ(execute) ಪಳಿ(output)ಯನ್ನು ನೋಡೋಣ:

$ ./a.out
2
3.220000

$ ./a.out
5
8.050000

ಉತ್ತರಗಳು ಈಗ ಸರಿಯಾಗಿವೆ!

Monday, November 8, 2010

ಹಳ್ಳಿ ದಾರಿಯಲ್ಲಿ.....

ಮೈಲಿಗಲ್ಲುಗಳು, ಬೋರ್ಡುಗಳು ಇಲ್ಲದೆ ಇರೋ ಹಳ್ಳಿದಾರಿಯಲ್ಲಿ ಯಾವತ್ತಾದರೂ ಗಾಡಿ ಓಡಿಸ್ಕೊಂಡು ಹೋಗಿದ್ದೀರ? ಅಂತಹ ದಾರಿಯಲ್ಲಿ ಅಲ್ಲಲ್ಲಿ ದಾರಿಯ ಬದಿಯಲ್ಲಿ ಸಿಗೋ ಹಳ್ಳಿಯವರೇ ನಮಗೆ ಮೈಲಿಗಲ್ಲುಗಳು, ಬೋರ್ಡುಗಳು ಎಲ್ಲ. ಆದರೆ ತೊಂದರೆ ಏನು ಅಂದರೆ, ಆ ಮೈಲಿಗಲ್ಲುಗಳು ಕೊಡೋ ಮಾಹಿತಿ ತಲೆನಾ ಮೊಸರುಗಡಿಗೆ ಮಾಡದೇ ಇರಲ್ಲ. "ಸ್ಟ್ರೇಟ್ ವೋಯ್ತಾ ಇರಿ ಸಾರ್, ಇನ್ನು ೮ ಮೈಲಿ ಅಶ್ಟೆ" ಅಂತ ಒಬ್ಬನ ಹತ್ತಿರ ಕೇಳಿ ಇನ್ನೂ ೧೨ ಕಿ.ಮೀ ಬಂದ ಮೇಲೆ ಇನ್ನೇನ್ ನಾವ್ ಹೋಗ್ತಾ ಇರೋ ಊರು ಬಂದೇ ಬಿಡ್ತು (೧ ಮೈಲಿ = ೧.೬೧ ಕಿ.ಮೀ, ೮*೧.೬೧ = ೧೨.೮೮) ಅಂತ ಇನ್ನೊಬ್ಬ ಯಾರೋ ಬದಿಯಲ್ಲಿ ಸಿಕ್ಕಿದ ಅಂತ ಕೇಳಿದ್ರೆ "ಏ, ಇನ್ನೇನ್ ಊರ್ ಬಂತ್ರಿ; ಇಲ್ಲಿಂದ ೫ ಕಿಲೋಮೀಟ್ರು ಅಶ್ಟೆ. ಬೇಕಿದ್ರೆ ಈ ಕಡೆ ಎಡಕ್ ತಿರ್ಕೊಂಡ್ ಓಗ್ಬುಡಿ, ಸ್ಯಾನೆ ಅತ್ರ ಆಯ್ತದೆ". ಇದೇನ್ ಈ ಹಯ್ದ ಹೀಗಂದನಲ್ಲ ಅಂತ ತಲೆ ಕೆಡಿಸ್ಕೊಂಡು ಬೇಗ ಹೋಗೋಣ ಅಂತ ಅವನು ತೋರಿಕೊಟ್ಟ short cut ತೊಗೊಂಡರೆ ಸಿಗೋದು ಗಾಡಿನೇ ಓಡಿಸೋದಕ್ಕೆ ಆಗದೆ ಇರೋ ಅಂತಹ ಬರಿ ಕಲ್ಲು-ಮಣ್ಣುಗಳ ದಾರಿ. ಅಲ್ಲಿ ಒದ್ದಾಡಿಕೊಂಡು ಅರೆ ಗಂಟೆಯಲ್ಲಿ ೨ ಕಿ.ಮೀ ಓಡಿಸಿ ಇನ್ನೊಬ್ಬ ಯಾರೋ ಸಿಕ್ದ ಅಂತ ಅವನನ್ನ ದಾರಿ ಕೇಳೋದಕ್ಕೆ ಹೋದ್ರೆ ಮತ್ತೆ ತಲೆಯನ್ನ ಮೊಸರಗಡಿಗೆ ಮಾಡೋ ಉತ್ತರಾನೇ ಸಿಗೋದು.

ಇದನ್ನೆಲ್ಲ, ಇಲ್ಲಿ ಯಾಕೆ ಹೇಳ್ತಿದ್ದೀನಿ ಅಂದ್ಕೊಂಡ್ರಾ? ನನ್ನ ಬ್ಲಾಗಿನ ಮುಂದಿನ ಬರಹದಲ್ಲಿ ಮೈಲಿಗಳನ್ನು ಕಿ.ಮೀಗೆ ಮಾರ್ಪಡಿಸುವ ಒಂದು ಹಮ್ಮನ್ನು ಬರೆದು ತೋರಿಸೋಣ ಅಂತ ಅಂದ್ಕೊಂಡಿದ್ದೆ. ಆದರೆ, ಏನ್ ಮಾಡಲಿ ಹಳ್ಳಿ ದಾರಿಯಲ್ಲಿ ಆದ ಇಂತಹ ಅನುಭವ ನನಗೆ ಕೂಡಲೇ ನೆನಪಾಯ್ತು, ಮತ್ತು ಅದನ್ನು ಹಂಚಿಕೊಳ್ಳದೆ ಇರಲು ಆಗಲಿಲ್ಲ. ಇರಲಿ ಈಗ, ಮೈಲಿಗಳನ್ನ, ಕಿಲೋಮೀಟರ್ ಆಗಿ ಮಾರ್ಪಡಿಸುವ ಈ ಹಮ್ಮನ್ನು ನೋಡಿ:

#include<stdio.h>

main() {
   int km, mile;

   scanf("%d",&mile);
   km = 1.61 * mile;
   printf("%d",km);
}

ಈ ಹಮ್ಮನ್ನು ಒಟ್ಟಿಸಿ(compile), ಎಸಗಿ ನೋಡೋಣ:

$ ./a.out
2
3 $


$ ./a.out
5
8 $

೨*೧.೬೧=೩.೨೨
೫*೧.೬೧=೮.೦೫
ಆದ್ರೆ ಈ ಹಾಳಾದ್ದು ತಪ್ಪು ಉತ್ತರ ಕೊಡ್ತಿದ್ಯಲ್ಲ? ನಮ್ಮ ಹಳ್ಳಿಯವರ ಬುದ್ದಿ ನಮ್ ಹಮ್ಮಿಗೂ ಅಂಟಿಕೊಂಡಿತು ಅಂತ ಅಂದ್ಕೊಂಡ್ರಾ? ಸರಿಯಾಗಿ ಗಮನಿಸಿ ನೋಡಿ. ಇದು ಕೊಡುತ್ತಿರುವ ಪಳಿ(output)ಯಲ್ಲಿ ಹದಿ-ಚುಕ್ಕೆ (decimal point) ಮತ್ತು ಅದರ ಬಳಿಕ ಬರುವ ಅಂಕಿಗಳು ಮಾಯವಾಗಿದ್ದು ಹದಿ-ಚುಕ್ಕೆಯ ಮೊದಲು ಬರುವ ಅಂಕೆ ಸರಿಯಾಗಿಯೇ ಇದೆ. ನಮ್ಮ ಹಮ್ಮನ್ನು ಒಮ್ಮೆ ನೋಡಿದರೆ ಗೊತ್ತಾಗುತ್ತೆ, ನಾವು ಮೈಲಿಯ ಬೆಲೆಯನ್ನು ಪಡೆಯುವ ಮಾರ್ಪಡಬಲ್ಲ(variable)ವನ್ನು ತುಂಬಂಕೆ(int)ಯಾಗಿ ಸಾರಿದ್ದೇವೆ(declared). ಅಂಕೆಯಲ್ಲಿ ಚುಕ್ಕೆ ಬಂದರೆ ಅದು ತುಂಬಂಕೆಯಲ್ಲವಲ್ಲ, ಅದಕ್ಕೆ ಪಳಿ(output)ಯಲ್ಲಿ ಸರಿ-ಉತ್ತರದ ತುಂಬಂಕೆಯ ಪಾಲು ಮಾತ್ರ ಬಂದಿದ್ದು, ಚುಕ್ಕೆ ಮತ್ತು ಅದರ ಬಳಿಕ ಬರುವ ಅಂಕೆಗಳು ಮಾಯವಾಗಿವೆ.

ಮುಂದಿನ ಬರಹದಲ್ಲಿ ಇದನ್ನು ಸರಿಪಡಿಸುವುದು ಹೇಗೆ ಅಂತ ನೋಡೋಣ.