我正在做一个我做RGB转换为luma的项目,而且我对-mno-sse2标志有一些舍入问题:
这是测试代码:
#include <stdio.h>
#include <stdint.h>
static double rec709_luma_coeff[3] = {0.2126, 0.7152, 0.0722};
int main()
{
uint16_t n = 242 * rec709_luma_coeff[0] + 242 * rec709_luma_coeff[1] + 242 * rec709_luma_coeff[2];
printf("%u\n", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而这就是我得到的:
user@gentoo>gcc -mno-sse2 test.c -o test && ./test
241
user@gentoo> gcc test.c -o test && ./test
242
Run Code Online (Sandbox Code Playgroud)
我想gcc使用sse2优化进行double乘法,但我没有得到的是为什么优化版本是正确的.
另外,您建议我使用什么来获得更一致的结果,ceil()或者floor()?
我有一些关于inttypes的问题,这里用这个小代码示例说明:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void print_byte(uint8_t b)
{
printf("%d%d%d%d%d%d%d%d\n",
!!(b & 128), !!(b & 64), !!(b & 32), !!(b & 16),
!!(b & 8), !!(b & 4), !!(b & 2), !!(b & 1));
}
int main()
{
FILE *f;
uint8_t bs = 8;
uint16_t bw = 100, bh = 200;
f = fopen("out", "w+");
print_byte(bs);
printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh);
fprintf(f, "%"PRIu8"%"PRIu16"%"PRIu16, bs, bw, bh);
fclose(f);
f = fopen("out", "r");
fscanf(f, "%"SCNu8"%"SCNu16"%"SCNu16, &bs, &bw, &bh);
printf("%"PRIu8" …Run Code Online (Sandbox Code Playgroud)