Một kỹ thuật tối ưu hoá biên dịch (constant expression comparison / common subexpression elimination) cần xác định hai biểu thức hằng có cho ra cùng giá trị hay không một cách chính xác tuyệt đối, không được sai số do dấu phẩy động.
Cho hai biểu thức trung tố, mỗi biểu thức chỉ gồm số nguyên không âm (có thể nhiều chữ số), dấu ngoặc đơn, toán tử hai ngôi +,−,×,÷ và toán tử trừ một ngôi (unary minus, có thể lặp nhiều lần liên tiếp, ví dụ --3 nghĩa là −(−3)=3). Biểu thức có thể chứa khoảng trắng tuỳ ý. Độ ưu tiên và kết hợp theo quy ước toán học thông thường: {+,−} thấp nhất (kết hợp trái), {×,÷} cao hơn (kết hợp trái), dấu ngoặc đơn cao nhất; toán tử trừ một ngôi áp dụng cho toàn bộ phần tử theo sau nó ở cùng mức ưu tiên (ví dụ -3+4 là (−3)+4=1, còn -(3+4) là −(7)=−7). Phép chia ÷ ở đây là phép chia phân số chính xác (không làm tròn) — ví dụ 10÷4=25.
Tính giá trị chính xác (dạng phân số tối giản) của mỗi biểu thức rồi so sánh. Nếu bằng nhau in EQUAL. Nếu khác nhau, in NOT EQUAL rồi in giá trị chính xác của biểu thức 1 và biểu thức 2 trên hai dòng tiếp theo, dưới dạng p/q với q>1, gcd(p,q)=1 (nếu giá trị là số nguyên thì chỉ in số nguyên đó, không có dấu /).
Dòng 1: biểu thức trung tố thứ nhất. Dòng 2: biểu thức trung tố thứ hai.
Nếu hai giá trị bằng nhau: in đúng một dòng EQUAL. Nếu khác nhau: dòng 1 in NOT EQUAL, dòng 2 in giá trị biểu thức 1, dòng 3 in giá trị biểu thức 2 (dạng p/q tối giản hoặc số nguyên).
Ví dụ:
Đầu vào:
(1+2)*3
9
Đầu ra:
EQUAL
Đầu vào:
1+2*3
7
Đầu ra:
EQUAL
Đang tải editor...