#include <boost/multiprecision/cpp_dec_float.hpp>
#include <iostream>
#include <cmath>
using namespace std;
namespace mp = boost::multiprecision;
using Real = mp::number<mp::cpp_dec_float<1024>>;
template<class T> T next_value(T val){
T res, x = 0, y = val, z;
while(x != y){
z = (x+y) / 2;
if(val + z != val){
res = val + z;
y = z;
} else {
x = y;
}
}
return res;
}
int main(){
int x1 = -1e9, y1 = 1e9-1;
int x2 = 1e9-1, y2 = -1e9+2;
cout << "(" << x1 << "," << y1 << ")" << endl;
cout << "(" << x2 << "," << y2 << ")" << endl;
cout << (long long) x1 * y2 - (long long) x2 * y1 << endl << endl;;
double tan1 = atan2((double)y1, (double)x1);
double tan2 = atan2((double)y2, (double)x2) + 2 * acos((double)0);
cout << setprecision(30) << fixed;
cout << tan1 << " " << next_value(tan1) << endl;
cout << tan2 << " " << next_value(tan2) << endl;
long double tan1ld = atan2((long double)y1, (long double)x1);
long double tan2ld = atan2((long double)y2, (long double)x2) + 2 * acos((long double)0);
cout << tan1ld << " " << next_value(tan1ld) << endl;
cout << tan2ld << " " << next_value(tan2ld) << endl;
Real tan1lld = atan2((Real)y1, (Real)x1);
Real tan2lld = atan2((Real)y2, (Real)x2) + 2 * acos((Real)0);
cout << tan1lld << " " << next_value(tan1lld) << endl;
cout << tan2lld << " " << next_value(tan2lld) << endl;
return 0;
}
I2luY2x1ZGUgPGJvb3N0L211bHRpcHJlY2lzaW9uL2NwcF9kZWNfZmxvYXQuaHBwPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjbWF0aD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cm5hbWVzcGFjZSBtcCA9IGJvb3N0OjptdWx0aXByZWNpc2lvbjsKdXNpbmcgUmVhbCA9IG1wOjpudW1iZXI8bXA6OmNwcF9kZWNfZmxvYXQ8MTAyND4+OwoKdGVtcGxhdGU8Y2xhc3MgVD4gVCBuZXh0X3ZhbHVlKFQgdmFsKXsKICBUIHJlcywgeCA9IDAsIHkgPSB2YWwsIHo7CgogIHdoaWxlKHggIT0geSl7CiAgICB6ID0gKHgreSkgLyAyOwogICAgaWYodmFsICsgeiAhPSB2YWwpewogICAgICByZXMgPSB2YWwgKyB6OwogICAgICB5ID0gejsKICAgIH0gZWxzZSB7CiAgICAgIHggPSB5OwogICAgfQogIH0KCiAgcmV0dXJuIHJlczsKfQoKaW50IG1haW4oKXsKICBpbnQgeDEgPSAtMWU5LCB5MSA9IDFlOS0xOwogIGludCB4MiA9IDFlOS0xLCB5MiA9IC0xZTkrMjsKCiAgY291dCA8PCAiKCIgPDwgeDEgPDwgIiwiIDw8IHkxIDw8ICIpIiA8PCBlbmRsOwogIGNvdXQgPDwgIigiIDw8IHgyIDw8ICIsIiA8PCB5MiA8PCAiKSIgPDwgZW5kbDsKICBjb3V0IDw8IChsb25nIGxvbmcpIHgxICogeTIgLSAobG9uZyBsb25nKSB4MiAqIHkxIDw8IGVuZGwgPDwgZW5kbDs7CgogIGRvdWJsZSB0YW4xID0gYXRhbjIoKGRvdWJsZSl5MSwgKGRvdWJsZSl4MSk7CiAgZG91YmxlIHRhbjIgPSBhdGFuMigoZG91YmxlKXkyLCAoZG91YmxlKXgyKSArIDIgKiBhY29zKChkb3VibGUpMCk7CgogIGNvdXQgPDwgc2V0cHJlY2lzaW9uKDMwKSA8PCBmaXhlZDsKCiAgY291dCA8PCB0YW4xIDw8ICIgIiA8PCBuZXh0X3ZhbHVlKHRhbjEpIDw8IGVuZGw7CiAgY291dCA8PCB0YW4yIDw8ICIgIiA8PCBuZXh0X3ZhbHVlKHRhbjIpIDw8IGVuZGw7CgogIGxvbmcgZG91YmxlIHRhbjFsZCA9IGF0YW4yKChsb25nIGRvdWJsZSl5MSwgKGxvbmcgZG91YmxlKXgxKTsKICBsb25nIGRvdWJsZSB0YW4ybGQgPSBhdGFuMigobG9uZyBkb3VibGUpeTIsIChsb25nIGRvdWJsZSl4MikgKyAyICogYWNvcygobG9uZyBkb3VibGUpMCk7CgogIGNvdXQgPDwgdGFuMWxkIDw8ICIgIiA8PCBuZXh0X3ZhbHVlKHRhbjFsZCkgPDwgZW5kbDsKICBjb3V0IDw8IHRhbjJsZCA8PCAiICIgPDwgbmV4dF92YWx1ZSh0YW4ybGQpIDw8IGVuZGw7CgogIFJlYWwgdGFuMWxsZCA9IGF0YW4yKChSZWFsKXkxLCAoUmVhbCl4MSk7CiAgUmVhbCB0YW4ybGxkID0gYXRhbjIoKFJlYWwpeTIsIChSZWFsKXgyKSArIDIgKiBhY29zKChSZWFsKTApOwoKICBjb3V0IDw8IHRhbjFsbGQgPDwgIiAiIDw8IG5leHRfdmFsdWUodGFuMWxsZCkgPDwgZW5kbDsKICBjb3V0IDw8IHRhbjJsbGQgPDwgIiAiIDw8IG5leHRfdmFsdWUodGFuMmxsZCkgPDwgZW5kbDsKCiAgcmV0dXJuIDA7Cn0K