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.
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.
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.
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);
}
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.