2024-06-02 22:04:54 +08:00
|
|
|
#include "sylib.h"
|
2024-04-14 22:20:29 +08:00
|
|
|
// float global constants
|
|
|
|
const float RADIUS = 5.5, PI = 03.141592653589793, EPS = 1e-6;
|
|
|
|
|
|
|
|
// hexadecimal float constant
|
|
|
|
const float PI_HEX = 0x1.921fb6p+1, HEX2 = 0x.AP-3;
|
|
|
|
|
|
|
|
// float constant evaluation
|
|
|
|
const float FACT = -.33E+5, EVAL1 = PI * RADIUS * RADIUS, EVAL2 = 2 * PI_HEX * RADIUS, EVAL3 = PI * 2 * RADIUS;
|
|
|
|
|
|
|
|
// float constant implicit conversion
|
|
|
|
const float CONV1 = 233, CONV2 = 0xfff;
|
|
|
|
const int MAX = 1e9, TWO = 2.9, THREE = 3.2, FIVE = TWO + THREE;
|
|
|
|
|
|
|
|
// float -> float function
|
|
|
|
float float_abs(float x) {
|
|
|
|
if (x < 0) return -x;
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
// int -> float function & float/int expression
|
|
|
|
float circle_area(int radius) {
|
|
|
|
return (PI * radius * radius + (radius * radius) * PI) / 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
// float -> float -> int function & float/int expression
|
|
|
|
int float_eq(float a, float b) {
|
|
|
|
if (float_abs(a - b) < EPS) {
|
|
|
|
return 1 * 2. / 2;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void error() {
|
|
|
|
putch(101);
|
|
|
|
putch(114);
|
|
|
|
putch(114);
|
|
|
|
putch(111);
|
|
|
|
putch(114);
|
|
|
|
putch(10);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ok() {
|
|
|
|
putch(111);
|
|
|
|
putch(107);
|
|
|
|
putch(10);
|
|
|
|
}
|
|
|
|
|
|
|
|
void assert(int cond) {
|
|
|
|
if (!cond) {
|
|
|
|
error();
|
|
|
|
} else {
|
|
|
|
ok();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void assert_not(int cond) {
|
|
|
|
if (cond) {
|
|
|
|
error();
|
|
|
|
} else {
|
|
|
|
ok();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
assert_not(float_eq(HEX2, FACT));
|
|
|
|
assert_not(float_eq(EVAL1, EVAL2));
|
|
|
|
assert(float_eq(EVAL2, EVAL3));
|
|
|
|
assert(float_eq(circle_area(RADIUS) /* f->i implicit conversion */,
|
|
|
|
circle_area(FIVE)));
|
|
|
|
assert_not(float_eq(CONV1, CONV2) /* i->f implicit conversion */);
|
|
|
|
|
|
|
|
// float conditional expressions
|
|
|
|
if (1.5) ok();
|
|
|
|
if (!!3.3) ok();
|
|
|
|
if (.0 && 3) error();
|
|
|
|
if (0 || 0.3) ok();
|
|
|
|
|
|
|
|
// float array & I/O functions
|
|
|
|
int i = 1, p = 0;
|
|
|
|
float arr[10] = {1., 2};
|
|
|
|
int len = getfarray(arr);
|
|
|
|
while (i < MAX) {
|
|
|
|
float input = getfloat();
|
|
|
|
float area = PI * input * input, area_trunc = circle_area(input);
|
|
|
|
arr[p] = arr[p] + input;
|
|
|
|
|
|
|
|
putfloat(area);
|
|
|
|
putch(32);
|
|
|
|
putint(area_trunc); // f->i implicit conversion
|
|
|
|
putch(10);
|
|
|
|
|
|
|
|
i = i * - -1e1;
|
|
|
|
p = p + 1;
|
|
|
|
}
|
|
|
|
putfarray(len, arr);
|
|
|
|
return 0;
|
|
|
|
}
|