取小数点 0.0901 并转换为具有 2 个整数位和 22 个小数位(总共 24 位)的定点值:
用于数学运算的 Ruby 语法(您可以剪切并粘贴到 irb(交互式 ruby)命令行工具中):
i = (0.0901 * 2**20) # 377906.7904
# truncat to integer value
i = i.to_i # 377906
# Convert to string using binary (base 2)
i.to_s(2) # "1011100010000110010"
要添加前导零(24 位长度),右对齐并用 0 填充
i.to_s(2).rjust(24, '0') # "000001011100010000110010"
# Convert to Hex (base 16)
i.to_s(16) # "5c432"
有符号数有点问题,最简单的方法是计算正值然后执行二进制补码:
(0.0065 * 2**22).to_i.to_s(2).rjust(24, '0')
=> "000000000110101001111110"
双补
"000000000110101001111110"
"111111111001010110000001" # Ones complement (bit invert)
"111111111001010110000001" + 1
"111111111001010110000010" #Twos complement
您有 24'b100000000110101001111110 这只是 MSB 设置为 1 的正数,这不是有符号数的正常工作方式。您使用的格式是符号幅度,但您不能只将其输入乘数(根据您之前的问题)。
注意:我也跳过了转换为定点的量化效果。按小数位缩放时的系数为 377906.7904。但是我们只取整数部分,给你一个错误0.7904,这可能会影响你的过滤器性能。