จากกระทู้แนะนำ เรื่อง DTAC เมื่อวานนี้ ที่มียอดเรียกเก็บ
461,168,601,842,738.80
บางรายเป็น
461,168,601,842,740.00
ซึ่งน่าจะมาจาก การปัดเศษ
กระทู้นี้จะลอง เดา สาเหตุดูว่ามันเกิดอะไรขึ้น และระบบของ DTAC ทำงานอย่างไร โดยที่ จขกท. ไม่ได้ทำงาน DTAC ไม่ได้เป็น Network Engineer ขนาดกด Reset Router ยังทำเองไม่เป็นเลย โดยจะใช้วิชา System Design + พื้นฐาน โปรแกรมมิ่งล้วนๆ
Input ที่ใช้ในการเดามีเพียง ยอด
461,168,601,842,738.80 บาท
เท่านั้น
ซึ่งตัวเลขนี้น่าสนใจ เพราะคนที่เรียนวิชาคอมพิวเตอร์มา จะรู้ว่า คอมพิวเตอร์นั้นเป็น เลขฐานสอง
มีเลขที่น่าสนใจคือ เลขฐานสอง 2
64 (2 ยกกำลัง 64) ซึ่งถ้าเขียนเป็นเลขฐานสองจะเท่ากับ
10000000000000000000000000000000000000000000000000000000000000000
(1 ตามด้วย 0 ทั้งหมด 64 ตัว)
ซึ่งแปลว่าเครื่อง Bandwidth Monitor รวนแน่นอน เพราะจำนวน Bandwidth นั้นควรจะเป็นจำนวนเต็มไม่ติดลบ แต่ค่า Unsigned long integer 64-bit นั้นสูงสุดที่ 2
64 - 1 เท่ากับว่า เลขข้างบนนั้น เครื่องมันต้องผิดพลาด หรือถ้าใช้ float กับ double (เลขที่มีค่าทศนิยม) มันจะดึงประสิทธิภาพเครื่องให้ต่ำลงมาครับ การออกแบบทีดีควรจะใช้ค่าจำนวนเต็ม
พอนำ 2
64 มาคิดเป็นเลขฐานสิบคือ
18,446,744,073,709,600,000 หน่วยเป็น bit (ค่าทางคณิตศาสตร์ 2
64 = 18,446,744,073,709,551,616 ดู Comment ที่ 41 อธิบายเรื่อง Precision และ IEEE 754 ใน Comment ที่ 44)
หน่วยเป็น Bit เวลาคิดค่าใช้จ่าย DTAC คิดเป็น Byte ดังนั้น ต้อง หาร 8 (8 bit เป็นหนึ่ง Byte)
18,446,744,073,709,600,000 หาร 8 ได้
2,305,843,009,213,690,000 Byte
และถ้า DTAC คิดค่าใช้จ่าย 5KB หรือ 5000 Byte ต่อ 1 บาท (ไม่ใช่ 5KiB เพราะ 5KiB = 5 x 2
10 = 5120 Bytes )
ค่าใช้จ่ายของแต่ละคนจะเท่ากับ
461,168,601,842,738.80 บาท
เป๊ะกว่านี้ ไม่มีอีกแล้ว
ทีนี้พอระบบ Billing เห็นว่าค่าใช้จ่าย 461,168,601,842,738.80 บาท เกิน Credit Limit ของแต่ละคน ระบบก็ระงับการใช้งาน
ตาม Algorithm นี้
If (Balance > Credit limit) Then
--- Service forbidden ---
Else
--- Service operated
End IF
ซึ่งรวมถึง 1678 ก็ไม่สามารถโทรได้อีกด้วย เพราะใช้งานเกิน Credit Limit แปลว่า 1678 อยู่ใน Service ข้างบนเหมือนกัน
สรุป Logic ของระบบ DTAC ที่แกะได้จากเหตุการณ์เมื่อวาน
1. จำนวน Bandwidth ของผู้ใช้ แต่ละคน Error อยู่ที่ 2
64
2. DTAC ใช้สูตร 5000 Byte คิด 1 บาท
3. ระบบ Billing ตั้งไว้ว่าถ้ายอดเกิน Limit จะระงับการใช้งานทันที (ไม่ได้ตั้งเวลา)
4. เบอร์ 1678 เป็นเบอร์เสียเงินปกติ เมื่อไม่มี Credit เหลือจึงโทรไม่ได้
เสร็จแล้วครับ ทั้งหมดนี้เป็นการ เดา จากหลักฐานที่มีอยู่
เอาละทีนี้มารอดูว่า DTAC จะอธิบาย สาเหตุกับ กสทช. ว่าอย่างไร
ขอบคุณครับ
เชิงอรรถ
กระทู้ปัญหา
https://ppantip.com/topic/37164769
https://ppantip.com/topic/37164252
https://ppantip.com/topic/37164313
Primitive data type ในภาษา Java
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Primitive data type ในภาษา C
http://www.geeksforgeeks.org/c-data-types/
Double precision floating point
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
แก้ไข 9 Dec 2017 5:21 PM 210 เป็น 2
10
แก้ไข 10 Dec 2017 4:55 PM เปลี่ยน KB เป็น KiB เพิ่มเชิงอรรถเรื่อง KiB และ IEEE 754
ขอบคุณสมาชิกหลายท่านที่ท้วงมาครับ
แกะรหัส DTAC
461,168,601,842,738.80
บางรายเป็น
461,168,601,842,740.00
ซึ่งน่าจะมาจาก การปัดเศษ
กระทู้นี้จะลอง เดา สาเหตุดูว่ามันเกิดอะไรขึ้น และระบบของ DTAC ทำงานอย่างไร โดยที่ จขกท. ไม่ได้ทำงาน DTAC ไม่ได้เป็น Network Engineer ขนาดกด Reset Router ยังทำเองไม่เป็นเลย โดยจะใช้วิชา System Design + พื้นฐาน โปรแกรมมิ่งล้วนๆ
Input ที่ใช้ในการเดามีเพียง ยอด
461,168,601,842,738.80 บาท
เท่านั้น
ซึ่งตัวเลขนี้น่าสนใจ เพราะคนที่เรียนวิชาคอมพิวเตอร์มา จะรู้ว่า คอมพิวเตอร์นั้นเป็น เลขฐานสอง
มีเลขที่น่าสนใจคือ เลขฐานสอง 264 (2 ยกกำลัง 64) ซึ่งถ้าเขียนเป็นเลขฐานสองจะเท่ากับ
10000000000000000000000000000000000000000000000000000000000000000
(1 ตามด้วย 0 ทั้งหมด 64 ตัว)
ซึ่งแปลว่าเครื่อง Bandwidth Monitor รวนแน่นอน เพราะจำนวน Bandwidth นั้นควรจะเป็นจำนวนเต็มไม่ติดลบ แต่ค่า Unsigned long integer 64-bit นั้นสูงสุดที่ 264 - 1 เท่ากับว่า เลขข้างบนนั้น เครื่องมันต้องผิดพลาด หรือถ้าใช้ float กับ double (เลขที่มีค่าทศนิยม) มันจะดึงประสิทธิภาพเครื่องให้ต่ำลงมาครับ การออกแบบทีดีควรจะใช้ค่าจำนวนเต็ม
พอนำ 264 มาคิดเป็นเลขฐานสิบคือ
18,446,744,073,709,600,000 หน่วยเป็น bit (ค่าทางคณิตศาสตร์ 264 = 18,446,744,073,709,551,616 ดู Comment ที่ 41 อธิบายเรื่อง Precision และ IEEE 754 ใน Comment ที่ 44)
หน่วยเป็น Bit เวลาคิดค่าใช้จ่าย DTAC คิดเป็น Byte ดังนั้น ต้อง หาร 8 (8 bit เป็นหนึ่ง Byte)
18,446,744,073,709,600,000 หาร 8 ได้
2,305,843,009,213,690,000 Byte
และถ้า DTAC คิดค่าใช้จ่าย 5KB หรือ 5000 Byte ต่อ 1 บาท (ไม่ใช่ 5KiB เพราะ 5KiB = 5 x 210 = 5120 Bytes )
ค่าใช้จ่ายของแต่ละคนจะเท่ากับ
461,168,601,842,738.80 บาท
เป๊ะกว่านี้ ไม่มีอีกแล้ว
ทีนี้พอระบบ Billing เห็นว่าค่าใช้จ่าย 461,168,601,842,738.80 บาท เกิน Credit Limit ของแต่ละคน ระบบก็ระงับการใช้งาน
ตาม Algorithm นี้
If (Balance > Credit limit) Then
--- Service forbidden ---
Else
--- Service operated
End IF
ซึ่งรวมถึง 1678 ก็ไม่สามารถโทรได้อีกด้วย เพราะใช้งานเกิน Credit Limit แปลว่า 1678 อยู่ใน Service ข้างบนเหมือนกัน
สรุป Logic ของระบบ DTAC ที่แกะได้จากเหตุการณ์เมื่อวาน
1. จำนวน Bandwidth ของผู้ใช้ แต่ละคน Error อยู่ที่ 264
2. DTAC ใช้สูตร 5000 Byte คิด 1 บาท
3. ระบบ Billing ตั้งไว้ว่าถ้ายอดเกิน Limit จะระงับการใช้งานทันที (ไม่ได้ตั้งเวลา)
4. เบอร์ 1678 เป็นเบอร์เสียเงินปกติ เมื่อไม่มี Credit เหลือจึงโทรไม่ได้
เสร็จแล้วครับ ทั้งหมดนี้เป็นการ เดา จากหลักฐานที่มีอยู่
เอาละทีนี้มารอดูว่า DTAC จะอธิบาย สาเหตุกับ กสทช. ว่าอย่างไร
ขอบคุณครับ
เชิงอรรถ
กระทู้ปัญหา
https://ppantip.com/topic/37164769
https://ppantip.com/topic/37164252
https://ppantip.com/topic/37164313
Primitive data type ในภาษา Java
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Primitive data type ในภาษา C
http://www.geeksforgeeks.org/c-data-types/
Double precision floating point
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
แก้ไข 9 Dec 2017 5:21 PM 210 เป็น 210
แก้ไข 10 Dec 2017 4:55 PM เปลี่ยน KB เป็น KiB เพิ่มเชิงอรรถเรื่อง KiB และ IEEE 754
ขอบคุณสมาชิกหลายท่านที่ท้วงมาครับ