如何测试定点库?

时间:2014-10-15 15:54:18

标签: c floating-point floating-point-conversion

我需要使用定点算法开发数学库。 我需要测试这个库。

为了进行测试,我需要执行以下操作:

  1. 读取浮点数。
  2. 将其转换为定点数
  3. 使用定点算法进行所有操作
  4. 将结果转换为浮点
  5. 写o / p(浮点数
  6. 但我不想在我的测试用例中使用float / double。那么我将如何执行Step-1和step-5?

1 个答案:

答案 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中具有无限数字,因此对数字输出进行限制非常重要。