小编rwa*_*ace的帖子

.Net/F#中的千位分隔符

使用千位分隔符打印整数的推荐方法是什么?到目前为止,我想出的最好的是

let thousands(x:int64) = String.Format("{0:0,0}", x)
Run Code Online (Sandbox Code Playgroud)

在大多数情况下都适用,但打印为零为00.

.net f#

5
推荐指数
2
解决办法
684
查看次数

操作员关联性何时重要?

大多数编程语言都有二元运算符的优先级和关联性表.在某些情况下,相关性很重要,例如(a - b) - c!= a - (b - c).

但是,对于像&&它似乎无关紧要的关联运算符,但大多数语言将其列为左关联.

有没有(a && b) && ca && (b && c)?之间存在差异的情况?

c syntax programming-languages operators associativity

5
推荐指数
1
解决办法
160
查看次数

DLL 函数调用的间接跳转

DLL 函数调用的地址修复是一个多阶段过程:链接器将调用指令定向到间接跳转指令,并将间接跳转指令定向到 Windows 程序加载器将放置的 .rdata 部分中的导入表中的一个内存字在运行时加载 DLL 时函数的地址。

间接跳转指令必须由链接器生成,因为编译器不知道该函数会出现在 DLL 中。通过为每个函数只生成一条间接跳转指令来最小化程序文件的大小,无论从多少地方调用它。

鉴于此,显而易见的方法是在所有目标文件中的所有编译器生成的代码之后收集文本部分末尾的所有间接跳转指令,这似乎是我尝试带有 Microsoft 链接器 /nodefaultlib 开关的简单测试用例(它生成一个足够小的可执行文件,我可以理解完整的反汇编)。

当我以正常方式将一个小程序与 C 标准库链接时,生成的可执行文件足够大,我无法跟踪所有的反汇编,但据我所知,间接跳转指令似乎分散在各处一次可能是三个小组的代码。

有没有我失踪的原因?

windows dll linker reverse-engineering portable-executable

5
推荐指数
1
解决办法
1018
查看次数

可执行文件的注释反汇编

将 C 程序编译为目标文件时,很容易让 Microsoft 编译器使用cl /Fa.

我试图从最终链接的可执行文件中得到类似的东西(假设程序是用适当的调试信息编译的),这似乎更棘手;dumpbin并且objdump似乎只提供无注释的反汇编。

获得它的最佳方法是什么?

c windows reverse-engineering disassembly visual-studio

5
推荐指数
1
解决办法
565
查看次数

将一阶逻辑转换为 CNF 没有指数膨胀

当试图在计算机上解决逻辑问题时,通常首先将它们转换为 CNF,因为最好的求解算法都希望 CNF 作为输入。

对于命题逻辑,这种转换的教科书规则很简单,但如果按原样应用它们,结果是非常罕见的情况之一,即程序遇到指数资源消耗而没有专门为此而构建:

a <=> (b <=> (c <=> ...))
Run Code Online (Sandbox Code Playgroud)

使用 N 个变量,生成 2^2^N 个子句,在等价到 AND/OR 的转换中一个指数爆发,另一个在 OR 到 AND 的分布中。

解决这个问题的方法是重命名子项。如果我们将上面的内容重写为类似

r <=> (c <=> ...)
a <=> (b <=> r)
Run Code Online (Sandbox Code Playgroud)

其中r是一个被定义为等于子项的新符号 - 通常,我们可能需要 O(N) 这样的符号 - 可以避免指数爆炸。

不幸的是,当我们尝试将其扩展到一阶逻辑时,这会遇到问题。使用 TPTP 表示法,其中?表示“存在”且变量以大写字母开头,请考虑

a <=> ?[X]:p(X)
Run Code Online (Sandbox Code Playgroud)

诚然,这种情况很简单,实际上不需要重命名子项,但有必要使用一个简单的情况来说明,因此假设我们使用的算法只是自动重命名等价运算符的参数;这一点可以推广到更复杂的情况。

如果我们尝试上述技巧并重命名?子项,我们会得到

r <=> ?[X]:p(X)
Run Code Online (Sandbox Code Playgroud)

存在变量被转换为 Skolem 符号,因此最终为

r <=> p(s)
Run Code Online (Sandbox Code Playgroud)

然后原始公式扩展为

(~a | r) & (a | ~r)
Run Code Online (Sandbox Code Playgroud)

其构造相当于

(~a | p(s)) & (a …
Run Code Online (Sandbox Code Playgroud)

conjunctive-normal-form first-order-logic

5
推荐指数
1
解决办法
375
查看次数

是否可以指示 JVM 仅记录完整 GC 事件?

该标志-verbose:gc使 JVM 将所有垃圾收集事件记录到 stdout。这包含有用的信息,但名副其实;每隔几秒就会发生一次小型 GC,因此其他信息往往会被淹没在洪水中。

有没有办法告诉它只记录完整的垃圾收集事件?

java garbage-collection jvm jvm-arguments

5
推荐指数
0
解决办法
208
查看次数

Python异常:如何打印堆栈跟踪的最后十行?

在 Python 和许多其他语言中,未捕获异常的默认行为是打印完整的堆栈跟踪。这很有用,只是数百行堆栈跟踪掩盖了以前的控制台输出,其中大部分数据都没有提供信息。我真的只是想看看堆栈跟踪的最后十行。

什么代码可以进入异常处理程序来打印堆栈跟踪,就像未捕获的异常发生的那样,除了只打印最后十行?

python exception python-3.x

5
推荐指数
1
解决办法
1119
查看次数

与 Box 层的模式匹配

我正在尝试解决 Rust 中的表达问题。我定义了一个总和类型的术语:

#[derive(Clone, Debug, PartialEq)]
pub enum Term {
    True,
    False,
    Not(Box<Term>),
    ...
}
Run Code Online (Sandbox Code Playgroud)

编译器和文档说Box递归术语是必需的,因为结构不能包含自身(无限回归),并且仅仅简单地&Term不足以确定术语拥有其子术语。好的,到目前为止一切顺利。

现在我正在尝试编写一个函数,根据运算符的定义简化术语,例如 not true = false:

impl Term {
    pub fn simplify(self) -> Term {
        let a = self.map(Term::simplify);
        match a {
            Term::Not(Box(Term::True)) => Term::False,
            _ => a,
        }
    }

    pub fn map(self, f: fn(Term) -> Term) -> Term {
        match self {
            Term::True
            | Term::False => self,
            Term::Not(a) => Term::Not(Box::new(a.map(f))),
            _ => panic!(),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译器不喜欢我迄今为止尝试过的任何版本。

Term::Not(Term::True)无效,因为 a …

pattern-matching rust sum-type

5
推荐指数
1
解决办法
746
查看次数

带有调用者信息的跟踪的简短语法

我正在寻找一种在 F# 中打印值以及源文件和行号的方法;它用于半交互式调试,因此语法需要简短。

https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/caller-information提供了部分解决方案。该页面上的代码可以这样调用:

Tracer().DoTrace "foo"
Run Code Online (Sandbox Code Playgroud)

我正在寻找

trace "foo"
Run Code Online (Sandbox Code Playgroud)

但是,当然,trace将上述内容包装在函数中将报告trace始终是调用者,这违背了目的。

我尝试过let inline trace ...,但这没有任何区别。

如果 F# 有这样的宏,我会尝试使用宏,但它没有。

通过修改上述链接代码或其他方式,trace以尽可能短的调用者语法获取功能的最佳方法是什么?

debugging f# attributes

5
推荐指数
1
解决办法
84
查看次数

为什么 bfloat16 有这么多指数位?

很明显为什么 16 位浮点格式开始用于机器学习;它降低了存储和计算的成本,而且神经网络对数字精度出人意料地不敏感。

\n

我发现特别令人惊讶的是,从业者放弃了已经定义的半精度格式,转而只为有效数分配 7 位,但为指数 \xe2\x80\x93 分配 8 位,完全与 32 位 FP 一样多。(维基百科将 Brain-floatbfloat16布局与 IEEE binary16 和某些 24 位格式进行了比较。)

\n

为什么有这么多指数位?到目前为止,我只找到了https://cloud.google.com/blog/products/ai-machine-learning/bfloat16-the-secret-to-high-performance-on-cloud-tpus

\n
\n

根据我们多年来在 Google\xe2\x80\x99s 产品和服务中训练和部署各种神经网络的经验,我们在设计 Cloud TPU 时就知道,神经网络对指数大小的敏感度远远高于对指数大小的敏感度。尾数。为了确保下溢、溢出和 NaN 具有相同的行为,bfloat16 具有与 FP32 相同的指数大小。然而,bfloat16 处理非正规数的方式与 FP32 不同:它将它们刷新为零。与 FP16 不同,FP16 通常需要通过损失缩放 [Mic 17] 等技术进行特殊处理,在训练和运行深度神经网络时,BF16 几乎可以替代 FP32。

\n
\n

我还没有在像谷歌这样的规模上运行过神经网络实验,但是在我运行过的实验中,绝对值远大于 1.0 的权重或激活意味着它已经陷入困境,将会螺旋式上升无穷大,如果计算机立即崩溃并显示错误消息,那对您来说是有好处的。我从未见过或听说过任何需要像单精度浮点 1e38 这样的动态范围的情况。

\n

那么我错过了什么?

\n

在某些情况下,神经网络确实需要巨大的动态范围吗?如果是这样,如何,为什么?

\n

是否有某种原因认为 bfloat16 使用相同的指数作为单精度非常有益,即使有效数要小得多?

\n

还是真正的目标是将有效数缩小到可以完成工作的绝对最小值,以最大限度地减少乘法器的芯片面积和能源成本(FPU 中最昂贵的部分)?碰巧这大约是 7 位;出于对齐原因,总大小应为 2 的幂;它不太适合 8 位;增加到 16,留下的多余位也可以用于某些用途,而最优雅的解决方案是保留 8 位指数?

\n

floating-point machine-learning cpu-architecture neural-network half-precision-float

5
推荐指数
1
解决办法
775
查看次数