控制台 I/O 支持(打印) - 2021.2 Chinese

Vitis 高层次综合用户指南 (UG1399)

Document ID
UG1399
Release Date
2021-12-15
Version
2021.2 Chinese

正如 ap_[u]fixed<> 变量初始化和赋值一样,Vitis HLS 支持打印显示超 64 位的值。

输出存储在 ap_[u]fixed 变量中的任意值的最简单方法是使用 C++ 标准输出串流:std::cout (#include <iostream> or <iostream.h>)。串流插入运算符 << 已重载,可正确输出任意给定 ap_[u]fixed 变量的全部可能值。以下串流操控程序同样受支持,以便按所示方式对该值进行格式化。

  • dec(十进制)
  • hex(十六进制)
  • oct(八进制)
    #include <iostream.h>
    // Alternative: #include <iostream>
    
    ap_fixed<6,3, AP_RND, AP_WRAP> Val = 3.25;
    
    cout << Val << endl;     // Yields: 3.25

使用标准 C 语言库

您还可使用标准 C 语言库 (#include <stdio.h>) 来打印大于 64 位的值:

  1. 使用 ap_[u]fixed 类方法 to_string() 将值转换为 C++ std::string
  2. 使用 std::string 类方法 c_str() 将结果转换为以 null 结尾的 C 语言字符串。

可选实参 1(指定基数)

您可为 ap[u]int::to_string() 方法传递 1 个可选实参以指定期望的数字格式的基数。有效的基数实参值包括:

  • 2(二进制)
  • 8(八进制)
  • 10(十进制)
  • 16(十六进制,默认值)

可选实参 2(打印为有符号的值)

ap_[u]int::to_string() 的第 2 个可选实参可指定是否将非十进制格式打印为有符号的值。该实参为布尔值。默认值为 false,导致非十进制格式打印为无符号的值。

ap_fixed<6,3, AP_RND, AP_WRAP> Val = 3.25;

printf("%s \n", in2.to_string().c_str()); // Yields: 0b011.010
printf("%s \n", in2.to_string(10).c_str()); //Yields: 3.25

以下 C++ 操控程序函数支持 ap_[u]fixed 类型:

  • setprecision
  • setw
  • setfill

setprecision 操控程序用于设置要使用的小数位精度。需 1 个参数 f 作为小数位精度的值,其中 n 用于指定要显示的有意义的最大位数(计算小数点前后的总位数)。

f 默认值为 6,与原生 C 浮点类型一致。

ap_fixed<64, 32> f =3.14159;
cout << setprecision (5) << f << endl;
cout << setprecision (9) << f << endl;
f = 123456;
cout << setprecision (5) << f << endl;

以上示例显示了以下结果,其中当实际精度超过指定精度时,将舍入打印的结果:

   3.1416
   3.14159
   1.2346e+05

setw 操控程序:

  • 用于设置要用作为字段宽度的字符数。
  • 需 1 个参数 w 作为宽度值

    其中

    • w 用于判定在某些输出表示法中将写入的最小字符数。

如果该表示法的标准宽度小于字段宽度,那么将以填充字符来填充该表示法。填充字符由 setfill 操控程序来控制,需 1 个参数 f 作为填充字符。

例如,给定:

    ap_fixed<65,32> aa = 123456;
    int precision = 5;
    cout<<setprecision(precision)<<setw(13)<<setfill('T')<<a<<endl;

输出为:

     TTT1.2346e+05