我需要使用定点算法开发数学库。 我需要测试这个库。
为了进行测试,我需要执行以下操作:
但我不想在我的测试用例中使用float / double。那么我将如何执行Step-1和step-5?
答案 0 :(得分:1)
如果没有浮点,显然可以轻松完成整数输入。如果您不知道如何 ,请阅读本网站上有关如何操作的问题(或研究此功能的第一部分)。在一般意义上,小数相对简单,只需将读数保持为整数,但要跟踪小数点后读取的位数,然后将输入值除以10 ^ digit_count。容易。
fixed_point input(source)
{
fixed_point value = 0;
fixed_point shift = 1;
char nextchar;
//read integer part
while(nextchar = source.get_next() && nextchar>='0' && nextchar<='9') {
auto digit = nextchar-'0';
value = value * base + digit;
}
//if there's a decimal...
if (nextchar == '.') {
//then read the fractional part
while(nextchar = source.get_next() && nextchar>='0' && nextchar<='9') {
auto digit = nextchar-'0';
value = value * base + digit;
shift = shift * 10;
}
//at this point, if input was "123.456"
//we have a value of "123456",
//and a shift of 1000. Simple division.
value /= shift;
}
return value;
}
并输出:
void output(sink, fixed_point value) {
fixed_point exponent = 1;
//find largest base10 exponent that's less than value
{
fixed_point check_exponent = exponent *10;
while(check_exponent >= fixed_point) {
exponent = check_exponent;
check_exponent = exponent *10;
}
}
//write integer part
do {
sink.write(int(value)/exponent +'0');
value -= int(value)/exponent*exponent;
exponent /= 10;
} while(exponent > 0);
//if there's a fraction
if (value > 0) {
sink.write('.');
int max_digits = 6; //or something
//write up to 6 digits
while(value>0 && max_digits) {
value *= 10;
sink.write(int(value));
value -= int(value);
max_digits -= 1;
}
}
}
请注意,此代码省略了许多小细节,例如数字类型,底片,source.get_next()如何工作以及溢出。另请注意,在实际代码中,您希望source.peek()
(或等效),并且仅在字符为.
时使用该字符,因此您在源缓冲区中留下尾随无效数字。这些都不接近编译,即使编译也可能有许多语义错误和疏忽。请注意,根据您的基数,输出可能在基数10中具有无限数字,因此对数字输出进行限制非常重要。