Phép tính đơn giản nhưng kết quả sai?

vậy cái này do lỗi phần mềm Processing gì rồi, chắc bên trong nó tính bằng float nên vậy. Đốt phần mềm đó đi @_@

vô cái forum hay github hay gửi email cho Processing chửi họ sao phép tính đơn giản xài double lại cho kết quả tầm bây.

4 Likes

Hi,
Mình donwload chương trình về chạy thử thì mình thấy kiểu float này được lưu dạng “gần đúng”
nghĩa là sau khi bạn gán:

float y2 = 20.562710;

thì y2 không có chính xác bằng 20.562710 nữa, bạn có thể kiểm tra bằng cách

println(y2 * 10000000);

đáng lẽ phải là 205627100 (thêm số 0 vào sau), nhưng kết quả lại là 205627104 (thêm số gần đúng còn lại chưa biết)

Nếu được thì chuyển ráng sang kiểu int.
VD muốn cho kết quả giống google ở trên:

void draw() {
  float x1,x2,y1,y2;
  x1=106.036;  
  y1= 20.56213;  
  x2=106.03519;
  y2= 20.56271;
    
  int _x1 = int(x1 * 10E4);
  int _y1 = int(y1 * 10E4);
  int _x2 = int(x2 * 10E4);
  int _y2 = int(y2 * 10E4);
    
  float pre = (_x1*_y2-_y1*_x2)/(10E9);
  println("pre=");
  println(pre);
}

Nói túm lại là nếu đầu vào là kiểu float thì phải chịu sai số thôi.

2 Likes

Mình chạy thế này thì kết quả ra gần đúng, vẫn có sai số

void draw(){
double x1,x2,y1,y2;

x1 = 106036;
y1 = 2056213;

x2 = 10603519;
y2 = 20562710;
double pre = (x1/1000.0)*(y2/1000000.0) - (x2/100000.0)*(y1/100000.0);

println("pre=");
println(pre);
}
1 Like

Cảm ơn bạn Gioi và Mato Nguyen.
Theo như cách của bạn Gioi: mình rất vui khi nó tính khá chính xác (đủ dùng) ở ví dụ đầu.
Tuy nhiên khi thay bằng một ví dụ khác thì nó lại không còn được như vậy , ví dụ cho:

x1= 106.03434;
y1=20.56307;
x2=106.03437;
y2=20.56239;

Chạy code trên : pre=-0.07378
Google tính : pre=-0.07272
Dẫu sao vẫn cảm ơn bạn Gioi rất nhiều. Mình đã phải chuyển sang dùng ESP2866 (chạy 32 bit) thì vấn đề đã được giải quyết.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?