使用脚本按元素减去原始浮点文件?

Subtract raw floating-point files elementwise, with a script?

我有两个文件,它们是 little-endian 32 位浮点值的原始序列(没有像无穷大、NaN、非正规数等疯狂的值),我想在第三个文件中产生它们的元素差异文件.

现在,我可以编写一个小实用程序来使用几乎所有编译语言相对高效地完成此操作,但我想知道我是否可以使用通用工具通过简短脚本更轻松地实现相同目的。我的直觉说“不”,因为它是非常“非文本”的作品,但也许我错了。

一个快速的 perl 脚本(将两个文件作为命令行参数,写入标准输出):

#!/usr/bin/env perl
use warnings;
use strict;

open my $file1, "<:raw", $ARGV[0] or die "Unable to open $ARGV[0]: $!\n";
open my $file2, "<:raw", $ARGV[1] or die "Unable to open $ARGV[1]: $!\n";
binmode STDOUT, ":raw";

while (read($file1, my $s1, 4) == 4 && read($file2, my $s2, 4) == 4) {
    my $f1 = unpack "f<", $s1;
    my $f2 = unpack "f<", $s2;
    print pack("f<", $f1 - $f2);
}

这里的关键是 packunpack's "f<" format to work with explicitly little-endian single precision floats (In the host systems' 本机格式,在大多数典型硬件上通常是 IEEE754。