想象一下两个正整数A和B.我想将这两个整数组合成一个整数C.
可能没有其他整数D和E组合为C.因此将它们与加法运算符组合不起作用.例如30 + 10 = 40 = 40 + 0 = 39 + 1连接也不起作用.例如"31"+"2"= 312 ="3"+"12"
这种组合操作也应该是确定性的(总是在相同的输入下产生相同的结果)并且应该总是在整数的正侧或负侧产生整数.
几个月前,我开始在C中开发用于空间应用的实时系统软件,以及用于C++的微控制器.在这样的系统中有一个经验法则,即永远不应该创建堆对象(因此没有malloc/new),因为它使程序不确定.当人们告诉我时,我无法验证此声明的正确性.那么,这是正确的陈述吗?
对我来说困惑的是,据我所知,确定性意味着两次运行程序将导致完全相同的执行路径.根据我的理解,这是多线程系统的一个问题,因为多次运行相同的程序可能每次都以不同的顺序运行不同的线程.
我做了一些搜索,我认为以下代码保证产生输出:
B.X = 7
B.X = 0
A.X = 1
A = 1, B = 0
Run Code Online (Sandbox Code Playgroud)
static class B
{
public static int X = 7;
static B() {
Console.WriteLine("B.X = " + X);
X = A.X;
Console.WriteLine("B.X = " + X);
}
}
static class A
{
public static int X = B.X + 1;
static A() {
Console.WriteLine("A.X = " + X);
}
}
static class Program
{
static void Main() {
Console.WriteLine("A = {0}, B = {1}", …Run Code Online (Sandbox Code Playgroud) 我正在阅读Java Hashmap文档,但我不明白这句话.
请注意,HashMap的迭代顺序是非确定性的.如果您想要确定性迭代,请使用LinkedHashMap.
确定性是什么意思?
我对一个看似简单的概念感到困惑.Mysql将确定性函数定义为函数
始终为相同的输入参数生成相同的结果
所以在我的理解中,功能就像
CREATE FUNCTION foo (val INT) READS SQL DATA
BEGIN
DECLARE retval INT;
SET retval = (SELECT COUNT(*) FROM table_1 WHERE field_1 = val);
RETURN retval;
END;
Run Code Online (Sandbox Code Playgroud)
不确定(不保证在2次调用函数之间不会发生删除/更新/插入).同时,我看到许多函数几乎完全相同,即基于查询结果的返回值,并声明为DETERMINISTIC.看起来我错过了一些非常基本的东西.
任何人都可以澄清这个问题吗?
谢谢.
更新
感谢那些回答(+1); 到目前为止,似乎存在广泛滥用DETERMINISTIC关键字的问题.我很难相信有这么多人这样做,所以我会等待其他答案.
我在fp:strict模式下使用MSVC进入了C库的超越数学函数的汇编.他们似乎都遵循相同的模式,这就是发生的事情sin.
首先,从名为"disp_pentium4.inc"的文件中有一个调度例程.它检查变量___use_sse2_mathfcns是否已设置; 如果是这样,电话__sin_pentium4,否则打电话__sin_default.
__sin_pentium4 (在"sin_pentium4.asm"中)首先将参数从x87 fpu传送到xmm0寄存器,使用SSE2指令执行计算,然后将结果加载回fpu.
__sin_default(在"sin.asm"中)将变量保存在x87堆栈上并简单地调用fsin.
因此,在这两种情况下,操作数推x87堆栈上和它返回为好,使之透明的来电,但如果___use_sse2_mathfcns被定义,在SSE2而不是的x87实际执行的操作.
这种行为是对我来说很有趣,因为的x87超越函数是臭名昭著的具有取决于实施的行为稍有不同,而SSE2的给定代码块要经常给重现的结果.
有没有办法确定在编译或运行时是否会使用SSE2代码路径?我不是很精通编写程序集,所以如果这涉及编写任何程序集,那么代码示例将不胜感激.
不太了解Haskell中并发性和并行性的上下文中的确定性.一些例子会有所帮助.谢谢
parallel-processing concurrency haskell deterministic non-deterministic
在最近的一个项目上工作时,我遇到了一位客户质量保证代表,他向我提出了一个我以前没有考虑过的问题:
您如何知道您使用的编译器生成的机器代码与C代码的功能完全匹配,并且编译器是完全确定的?
对于这个问题,我完全没有回复,因为我一直认为编译器是理所当然的.它接收代码并喷出机器代码.我怎样才能测试编译器实际上没有添加我没有要求的功能?甚至更危险地以与我期望的方式略有不同的方式实现代码?
我知道这对每个人来说并不是一个真正的问题,而且答案可能只是......"你已经超过了桶并处理它".但是,在嵌入式环境中工作时,您会隐式地信任您的编译器.我怎样才能向自己和QA证明我这样做是对的?
通过确定性,我隐约意味着可以用于航空航天飞行软件等关键实时软件.垃圾收集器(以及动态内存分配)在飞行软件中是很大的禁忌,因为它们被认为是非确定性的.但是,我知道正在对此进行研究,所以我想知道这个问题是否已经解决了.
我还在问题中包括任何垃圾收集算法,这些算法限制了它们的使用方式.
我在一个非常规范的环境中工作,我们需要能够生成相同的二进制输入,每次都可以为构建产品提供相同的源代码.我们目前使用的古老版本的g ++已被修补,不会在生成的二进制文件中写入任何类似日期/时间的内容,这些日期/时间会从构建更改为构建,但我想更新为g ++ 4.7.2.有没有人知道一个补丁,或者有什么建议我需要寻找两个相同的源代码并产生相同的二进制输出?