Intel® 高层次综合编译器专业版Pro版: 参考手册

ID 683349
日期 12/04/2023
Public
文档目录

8.2.1. 运算中的任意精度定点Literal(字面常量)

当您使用ac_fixed数据类型来声明组件中的literal时,编译器会将literal进行扩展,无论您为ac_fixed literal设置怎样的大小。为了避免编译器扩展literal,请将literal转换为ac_fixed数据类型。

例如,以下代码片段中的literal被视为double数据类型:
Using Fixed12 = ac_fixed<12, 6, true>;

component Fixed12 threshold_vanilla(Fixed12 a){
    if (a < 12.7) {
        return a;
    } else {
        return 12.7;
    }
}

在此代码片段中,12位ac_fixed值与12.7进行比较。literal(字面常量)12.7被视为double,值为12.699999…。此literal被转换为定点,以便与a对比,但是因为literal不受约束,编译器会选择一个较大的定点值,这样会导致较大的比较:

您可以通过将literal(字面常量)12.7强制转换为适当大小的ac_fixed数据类型:
Using Fixed12 = ac_fixed<12, 6, true>;

component Fixed12 threshold_cast(Fixed12 a){
    if (a < (Fixed12)12.7) {
        return a;
    } else {
        return 12.7;
    }
}

关于选择单精度literal和函数而非双精度副本(counterpart)的影响的更多详细信息,请查看以下教程:
<quartus_installdir>//hls/examples/tutorials/best_practices/single_vs_double_precision_math