小编Pau*_*ick的帖子

如果两种语言遵循IEEE 754,两种语言的计算会产生相同的答案吗?

我正在将程序从Scilab代码转换为C++.特别是一个循环产生的结果与原始的Scilab代码略有不同(这是一段很长的代码,因此我不会在问题中包含它,但我会尽力总结下面的问题).

问题是,循环的每一步都使用上一步的计算.此外,计算之间的差异仅在第100,000次迭代(大约300,000次)中变得明显.

注意:我正在使用"format(25)"将我的C++程序的输出与Scilab 5.5.2的输出进行比较.命令.含义我正在比较25位有效数字.我还想指出,我理解在一定数量的位之后无法保证精度,但在评论之前阅读下面的部分.到目前为止,两种语言之间的所有计算都相同,最多可达25位.

为了找到问题的根源,到目前为止我已经尝试过:

  1. 检查正在使用的数据类型:

我已经设法确认Scilab正在使用IEEE 754双打(根据语言文档).另外,根据维基百科,C++ 并不需要使用IEEE 754双打,但我可以告诉,我到处使用双C++中它已完全匹配的Scilab的结果.

  1. 检查超越函数的使用:

我还读过每个计算机科学家应该知道的关于浮点运算的内容,IEEE不要求超越函数完全舍入.考虑到这一点,我在两种语言中比较了这些函数的结果(sin(),cos(),exp()),结果看起来是相同的(最多25位).

  1. 使用其他功能和预定义值:

我重复了上述步骤,以便使用sqrt()和pow().以及Pi的值(我在C++中使用M_PI,在Scilab中使用%pi).同样,结果是一样的.

  1. 最后,我重写了循环(非常仔细),以确保两种语言之间的代码相同.

注意:有趣的是,我注意到,对于上述所有计算,两种语言之间的结果与计算的实际结果(浮点运算之外)相匹配得更远.例如:

使用Wolfram Alpha = sin(x)的值= 0.123456789 .....

使用Scilab&C++ = sin(x)的值= 0.12345yyyyy .....

甚至一旦使用Scilab或C++计算的值开始与实际结果不同(来自Wolfram).每种语言的结果仍然相互匹配.这使我相信大多数值都以相同的方式计算(在两种语言之间).即使IEEE 754不要求它们.


我最初的想法是上述前三点之一,两种语言之间的实现方式不同.但据我所知,一切似乎都会产生相同的结果.

是否有可能即使这些循环的所有输入都相同,结果也可能不同?可能是因为一个非常小的错误(过去我能看到的25位数)正在发生,随着时间累积?如果是这样,我该如何解决这个问题呢?

c++ floating-point precision rounding-error scilab

10
推荐指数
2
解决办法
367
查看次数

我多久可以使用Socket.IO发送数据?

我正在创建一个Web应用程序,需要将少量数据(每个插槽3个整数值)从服务器发送到客户端非常频繁,我想看看是否有使用Socket.IO更新客户端的最大频率.

我希望至少实现50个套接字连接,每个连接每秒发送20个更新.理想的数字是200个套接字连接,每秒发送50个更新.

问题:使用Socket.IO发送新数据的频率是否有限制?

注意:我认识到这也成为服务器 - 客户端连接的速度问题,因此我需要了解有关连接速度的任何信息.我计算出,如果发送的每个数据包大约是500字节,那么我将能够在1 MB/s连接上每秒发送20次更新到100个连接.

javascript sockets websocket node.js socket.io

8
推荐指数
2
解决办法
4543
查看次数

如何在Linux上编译Windows Visual C++代码

注意:这个问题的目的是找出是否存在一种在VC中为Windows开发的标准方法,并将该代码平滑地移植到Linux系统上(意思是对代码进行尽可能少的编辑),以便它可以编译成可执行文件并运行.

根据我收到的答案,我可以看到存在误解.因此,我打算将这个问题分成两个单独的问题.一个是我原来的(修订后的问题),另一个是我的具体问题以及如何解决它.(我会在发布后添加这个问题的链接).

注意:我对C++很陌生,并使用makefile进行编译.

我一直在创建一个可以在Linux服务器上运行的C++程序,到目前为止我一直在使用Visual Studio(Window的当前版本)编写所有代码.为了安全起见,在我开始编写程序之前,我尝试在VC中创建一些基本的C++文件,将它们传输到我的服务器,然后用g ++编译它们并运行可执行文件.一切顺利,所以我想:

"嘿,我可以继续编写我的整个程序,遵循相同的流程,一切都会好的!"

显然,我错了,这就是我在这里的原因.

当我运行我的makefile时,我得到了几十个错误,我不确定如何处理这种情况.大量的错误消息似乎暗示了我使用向量(当然,在使用VC编译时运行正常).

我看过以下问题:

如何在Visual Studio 2010 for Linux中编译

将Visual Studio C++移植到Linux

在Linux中编译Visual C++代码?

但我真的找不到直接解决我的问题的方法(例如我宁愿避免在Linux平台上安装VC而只是在那里工作).

我也研究过(并尝试使用)wineg ++但是它在编译时似乎没有改变任何东西.

我该怎么办这个问题?

含义:通常的做法是在Windows VC上开发然后移植到Linux?如果是这样,是否有确保一切顺利的标准方法?或者只是了解Linux上的编译器如何正常工作和编码,以便不会发生错误?

最好是一种解决方案,允许我在Windows上继续开发,并在完成后简单地将所有内容移植到Linux上.如果可能的话,尝试尽可能简单地做出任何答案,当涉及到大部分内容时,我仍然非常业余.

编辑:我还想提一下,我并没有真正使用任何疯狂的库.只是math.h矢量.

一些错误的例子是:

使用一些双精度初始化矢量:

在此输入图像描述

相应的编译错误:

在此输入图像描述

c++ linux makefile compilation

6
推荐指数
1
解决办法
9675
查看次数

为什么这个表达式没有正确评估?

我正在尝试在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,表达式将被评估为: Wolfram的结果

我还尝试分解表达式的每个部分,以检查"pow()"函数之类的函数是否正常工作,或者M_PI是否准确,但是在我一次评估所有内容之前,所有内容似乎都是一致的.

我错过了什么,为什么我的答案不正确?

我一直在看这段代码很长一段时间,我似乎无法弄清楚发生了什么.我在想它可能是某种精确错误?

c++

0
推荐指数
1
解决办法
64
查看次数