我正在将程序从Scilab代码转换为C++.特别是一个循环产生的结果与原始的Scilab代码略有不同(这是一段很长的代码,因此我不会在问题中包含它,但我会尽力总结下面的问题).
问题是,循环的每一步都使用上一步的计算.此外,计算之间的差异仅在第100,000次迭代(大约300,000次)中变得明显.
注意:我正在使用"format(25)"将我的C++程序的输出与Scilab 5.5.2的输出进行比较.命令.含义我正在比较25位有效数字.我还想指出,我理解在一定数量的位之后无法保证精度,但在评论之前阅读下面的部分.到目前为止,两种语言之间的所有计算都相同,最多可达25位.
为了找到问题的根源,到目前为止我已经尝试过:
我已经设法确认Scilab正在使用IEEE 754双打(根据语言文档).另外,根据维基百科,C++ 并不需要使用IEEE 754双打,但我可以告诉,我到处使用双C++中它已完全匹配的Scilab的结果.
我还读过每个计算机科学家应该知道的关于浮点运算的内容,IEEE不要求超越函数完全舍入.考虑到这一点,我在两种语言中比较了这些函数的结果(sin(),cos(),exp()),结果看起来是相同的(最多25位).
我重复了上述步骤,以便使用sqrt()和pow().以及Pi的值(我在C++中使用M_PI,在Scilab中使用%pi).同样,结果是一样的.
注意:有趣的是,我注意到,对于上述所有计算,两种语言之间的结果与计算的实际结果(浮点运算之外)相匹配得更远.例如:
使用Wolfram Alpha = sin(x)的值= 0.123456789 .....
使用Scilab&C++ = sin(x)的值= 0.12345yyyyy .....
甚至一旦使用Scilab或C++计算的值开始与实际结果不同(来自Wolfram).每种语言的结果仍然相互匹配.这使我相信大多数值都以相同的方式计算(在两种语言之间).即使IEEE 754不要求它们.
我最初的想法是上述前三点之一,两种语言之间的实现方式不同.但据我所知,一切似乎都会产生相同的结果.
是否有可能即使这些循环的所有输入都相同,结果也可能不同?可能是因为一个非常小的错误(过去我能看到的25位数)正在发生,随着时间累积?如果是这样,我该如何解决这个问题呢?
我正在创建一个Web应用程序,需要将少量数据(每个插槽3个整数值)从服务器发送到客户端非常频繁,我想看看是否有使用Socket.IO更新客户端的最大频率.
我希望至少实现50个套接字连接,每个连接每秒发送20个更新.理想的数字是200个套接字连接,每秒发送50个更新.
问题:使用Socket.IO发送新数据的频率是否有限制?
注意:我认识到这也成为服务器 - 客户端连接的速度问题,因此我需要了解有关连接速度的任何信息.我计算出,如果发送的每个数据包大约是500字节,那么我将能够在1 MB/s连接上每秒发送20次更新到100个连接.
注意:这个问题的目的是找出是否存在一种在VC中为Windows开发的标准方法,并将该代码平滑地移植到Linux系统上(意思是对代码进行尽可能少的编辑),以便它可以编译成可执行文件并运行.
根据我收到的答案,我可以看到存在误解.因此,我打算将这个问题分成两个单独的问题.一个是我原来的(修订后的问题),另一个是我的具体问题以及如何解决它.(我会在发布后添加这个问题的链接).
注意:我对C++很陌生,并使用makefile进行编译.
我一直在创建一个可以在Linux服务器上运行的C++程序,到目前为止我一直在使用Visual Studio(Window的当前版本)编写所有代码.为了安全起见,在我开始编写程序之前,我尝试在VC中创建一些基本的C++文件,将它们传输到我的服务器,然后用g ++编译它们并运行可执行文件.一切顺利,所以我想:
"嘿,我可以继续编写我的整个程序,遵循相同的流程,一切都会好的!"
显然,我错了,这就是我在这里的原因.
当我运行我的makefile时,我得到了几十个错误,我不确定如何处理这种情况.大量的错误消息似乎暗示了我使用向量(当然,在使用VC编译时运行正常).
我看过以下问题:
如何在Visual Studio 2010 for Linux中编译
但我真的找不到直接解决我的问题的方法(例如我宁愿避免在Linux平台上安装VC而只是在那里工作).
我也研究过(并尝试使用)wineg ++但是它在编译时似乎没有改变任何东西.
我该怎么办这个问题?
含义:通常的做法是在Windows VC上开发然后移植到Linux?如果是这样,是否有确保一切顺利的标准方法?或者只是了解Linux上的编译器如何正常工作和编码,以便不会发生错误?
最好是一种解决方案,允许我在Windows上继续开发,并在完成后简单地将所有内容移植到Linux上.如果可能的话,尝试尽可能简单地做出任何答案,当涉及到大部分内容时,我仍然非常业余.
编辑:我还想提一下,我并没有真正使用任何疯狂的库.只是math.h和矢量.
一些错误的例子是:
使用一些双精度初始化矢量:
相应的编译错误:
我正在尝试在C++中评估以下表达式.我正在使用Visual Studio(当前版本),如果这有任何区别.
#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
std::cout << (1.686 * 1000 / (4 / 3) / M_PI / (pow(0.015, 3)) / 3340);
Run Code Online (Sandbox Code Playgroud)
现在,当我执行程序时,输出是:
47608.8
然而,如果我使用WolframAlpha,表达式将被评估为:

我还尝试分解表达式的每个部分,以检查"pow()"函数之类的函数是否正常工作,或者M_PI是否准确,但是在我一次评估所有内容之前,所有内容似乎都是一致的.
我错过了什么,为什么我的答案不正确?
我一直在看这段代码很长一段时间,我似乎无法弄清楚发生了什么.我在想它可能是某种精确错误?