หน้าเว็บ

วันพุธที่ 2 ธันวาคม พ.ศ. 2552

shell script with floating point

มีรุ่นน้องในแลบถามผมว่า อยากจะทำ for loop ให้ มันแสดงค่าตั้งแต่ 0.01 ถึง 0.20 ทำยังไงดี? ซึ่งน้องเค้าตรง for loop ก็ทำเป็น integer 1 ถึง 20 แต่ว่า ตอนแสดงจะนำมาหารด้วย 100

ปัญหาอย่างหนึ่งของ shell script คือทำ floating point arithmetic operation ดื้อๆไม่ได้ ดังนั้นมันจึงเอามาหาร 100 เกิดเป็นทศนิยมไม่ได้

วิธีแก้ปัญหาก็แน่นอนอาจจะเขียน script python perl c ฯลฯ อะไรก็ได้ในการแก้ปัญหานี้
แต่ว่าผมพบอีกวิธีนึงซึ่งก็ค่อนข้าง work และถูกออกแบบมาทำเพื่อทำ arithmetic operation อย่างเดียวเลย ก็คือการใช้ bc หรือ bash calculator

ซึ่งจริงๆก็เขียนคล้ายๆพวก script ต่างๆนั่นแหล่ะ เช่นถ้าต้องการจะทำผลลัพธ์ for loop ที่กล่าวไว้ข้างต้นก็ทำได้โดยจับมายำกับ shell script แบบนี้

for ((i=1;i<20;i+=1)) do printf "0%s\n" $(echo "scale=2; $i/100" | bc); done

จริงๆแล้วจะยัดพวก for อะไร เข้าไปใน bc ทั้งหมดเลยก็ได้ แต่อันนี้เพียงต้องการแสดงให้เห็นว่าถ้ามี shell script อยู่แล้ว และต้องการทำ floating point arithmetic operation แค่บางจุดจะต้องทำอย่างไรเท่านั้น

ระบบที่ทดสอบ
OS: Ubuntu 9.04