在用emscripten 3.1.17编译ffmpeg (提交1368b5a)时,有两个警告,我希望互联网能帮助我更好地理解(我不是一个有丰富c++经验的人):
fftools/ffmpeg.c:339:41: warning: macro 'ATOMIC_VAR_INIT' has been marked as deprecated [-Wdeprecated-pragma]
static atomic_int transcode_init_done = ATOMIC_VAR_INIT(0);
^
/home/XYZ/ffmpeg-wasm/modules/emsdk/upstream/lib/clang/15.0.0/include/stdatomic.h:50:41: note: macro marked 'deprecated' here
#pragma clang deprecated(ATOMIC_VAR_INIT)
^我知道在这个地方是不推荐的,但是用哪个工具(emscripten,clang)呢?以及哪一方参与了修复工作。
另一个也很有趣:
fftools/ffmpeg_filter.c:898:35: warning: floating-point comparison is always true; constant cannot be represented exactly in type 'float' [-Wliteral-range]
if (audio_drift_threshold != 0.1)
~~~~~~~~~~~~~~~~~~~~~ ^ ~~~信息和后果是非常清楚的。我不清楚的是,是如果这是特定的编译器问题,还是代码问题,哪些方面需要注意?
发布于 2022-08-02 11:25:09
对于ATOMIC_VAR_INIT,我找到了这张便条
这个宏是C11原子类型早期设计草案的一部分。它在C11中不需要,在C17中被废弃,在C23中被删除。
因此,反对是按照C标准(和C++标准,尽管在C++20中被废弃了)进行的。
至于浮点问题,编译器直接声明:
常量不能准确地表示为“浮动”类型
这是完全正确的。在二进制中,数字的每一点表示二的幂。在整数中这是相当容易的,比特代表1,2,4,8,16,32,64,.与0,1,2,3,4,5,6,
例如,整数:0b100101是(右边的低位):1+4+32=37。
浮点数大致相同,但还有一些复杂问题(我将在这里略过)。基本上,这些位现在代表了2的负幂: 0.5,0.25,0.125,0.0625,.但不幸的是,这并不允许我们表示所有可能的十进制数(这是一项不可能的任务,在0到1之间有无限多的十进制数,而且我们只有有限的字节数的组合)。
事实证明,0.1是不可能用二进制浮点编码的数字之一。这是合理的,因为0.1是1/2 * 1/5,而1/5不能表示为2的幂。
如果你算一算,你会发现:
2^-4 + 2^-5 + 2^-8 + 2^-9 + 2^-12 + 2^-13 = 0.0999755859375
如果您永远继续这个序列(跳过两个异能,添加两个异能,重复),那么您将无限接近0.1。但这是我们所能做的最好的。
如果您想做更多的阅读,那么下面是一些链接:
现在,我有点不确定的是:
警告:浮点比较总是正确的。
从技术上讲,0.1应该转换成一些位模式,如果然后在!=检查中抛出一个具有完全相同位模式的变量,那么结果应该是false。但也许编译器做出了一个执行决定,只是说:“永远是true",因为得到确切的位模式是极不可能的,而且是脆弱的。
但是不管是什么情况,更重要的是:float != 0.1是一个非常糟糕的测试。上面的链接比我所能做的要好得多,但基本上你永远不想测试浮点是否严格相等--你总是想要添加一个有价值的epsilon (这取决于您比较的数字)。
例如:abs(float - 0.1) < epsilon。
https://stackoverflow.com/questions/73203857
复制相似问题