#include <iso646.h> // not, and
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
typedef bool (*func_t)(double);
bool is_negative_zero(double f) {
return signbit(f) and f >= 0;
}
bool is_negative_zero_2(double f) {
return f == 0 and signbit(f);
}
bool is_negative_zero_x(double f) {
return f == 0 and 1/f < 0;
}
int test(func_t f, char* msg) {
int nerrors = 0;
double a[] = {0., 1., -1., 0./0., 1/0., -1/0., 0./(1/0.), 1./(1/0.), };
for (int i = 0; i < sizeof(a)/sizeof(*a); ++i) {
if (f(a[i])) {
++nerrors;
fprintf(stderr
, "error: %s f=%lf\n", msg
, a
[i
]); }
}
if (not (f(-0.) and f(-1./(1/0.)))) {
++nerrors;
fprintf(stderr
, "error: %s f=%s\n", msg
, "-0."); }
return nerrors;
}
int main() {
int nerrors = 0;
nerrors += test(is_negative_zero, "signbit");
nerrors += test(is_negative_zero_2, "x == 0 and signbit(x)");
nerrors += test(is_negative_zero_x, "1/x");
return (bool)nerrors;
}
I2luY2x1ZGUgPGlzbzY0Ni5oPiAgLy8gbm90LCBhbmQKI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIGJvb2wgKCpmdW5jX3QpKGRvdWJsZSk7Cgpib29sIGlzX25lZ2F0aXZlX3plcm8oZG91YmxlIGYpIHsKICByZXR1cm4gc2lnbmJpdChmKSBhbmQgZiA+PSAwOwp9Cgpib29sIGlzX25lZ2F0aXZlX3plcm9fMihkb3VibGUgZikgewogIHJldHVybiBmID09IDAgYW5kIHNpZ25iaXQoZik7Cn0KCmJvb2wgaXNfbmVnYXRpdmVfemVyb194KGRvdWJsZSBmKSB7CiAgcmV0dXJuIGYgPT0gMCBhbmQgMS9mIDwgMDsKfQoKaW50IHRlc3QoZnVuY190IGYsIGNoYXIqIG1zZykgewogIGludCBuZXJyb3JzID0gMDsKICBkb3VibGUgYVtdID0gezAuLCAxLiwgLTEuLCAwLi8wLiwgMS8wLiwgLTEvMC4sIDAuLygxLzAuKSwgMS4vKDEvMC4pLCB9OwogIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGEpL3NpemVvZigqYSk7ICsraSkgewogICAgaWYgKGYoYVtpXSkpIHsKICAgICAgKytuZXJyb3JzOwogICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlcyBmPSVsZlxuIiwgbXNnLCBhW2ldKTsKICAgIH0KICB9CiAgaWYgKG5vdCAoZigtMC4pIGFuZCBmKC0xLi8oMS8wLikpKSkgewogICAgKytuZXJyb3JzOwogICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXMgZj0lc1xuIiwgbXNnLCAiLTAuIik7CiAgfQogIHJldHVybiBuZXJyb3JzOwp9CmludCBtYWluKCkgewogIGludCBuZXJyb3JzID0gMDsKICBuZXJyb3JzICs9IHRlc3QoaXNfbmVnYXRpdmVfemVybywgInNpZ25iaXQiKTsKICBuZXJyb3JzICs9IHRlc3QoaXNfbmVnYXRpdmVfemVyb18yLCAieCA9PSAwIGFuZCBzaWduYml0KHgpIik7CiAgbmVycm9ycyArPSB0ZXN0KGlzX25lZ2F0aXZlX3plcm9feCwgIjEveCIpOwogIHJldHVybiAoYm9vbCluZXJyb3JzOwp9