草庐IT

floating-point-precision

全部标签

c++ - 从 float 转换为自定义数字类型

我已经创建了我自己的固定类型整数类型,并且该库适用于许多编译器和平台,唯一需要解决的问题是将内置浮点类型转换为我的类型。浮点类型的尾数可能很小,但与指数一起可能有很大的值(value),所以如果我选择转换float、double或longdouble对longlong或unsignedlonglong说可能会发生截断。如果编译器使用IEEE-754规范,提取尾数和指数会很容易,但如果编译器使用其他格式怎么办。那么,我的问题是:是否有任何通用算法允许我仅使用语言功能从float中提取完整值?谢谢 最佳答案 您可能会发现有用的myans

c++ - 为什么 g++(4.6 和 4.7)将这个除法的结果提升为 double ?我能阻止吗?

我正在编写一些模板代码来对同时使用float和double的数值算法进行基准测试,以便与GPU实现进行比较。我发现我的浮点代码速度较慢,在调查使用Intel的VtuneAmplifier后,我发现g++正在生成额外的x86指令(cvtps2pd/cvtpd2ps和unpcklps/unpcklpd)以将一些中间结果从float转换为double然后再返回再次。此应用程序的性能下降了近10%。在使用标志-Wdouble-promotion编译后(顺便说一句,-Wall或-Wextra不包含),果然g++警告我结果正在提升。我将其简化为如下所示的简单测试用例。请注意,C++代码的顺序会影响

c++ - 将 vector<Point2f> 传递给 getAffineTransform

我正在尝试计算视频中两个连续帧之间的仿射变换。所以我找到了特征并得到了两帧中的匹配点。FastFeatureDetectordetector;vectorframe1_features;vectorframe2_features;detector.detect(frame1,frame1_features,Mat());detector.detect(frame2,frame2_features,Mat());vectorfeatures1;//matchedpointsin1stimagevectorfeatures2;//matchedpointsin2ndimagefor(int

c++ - 16 位 float MPI_Reduce?

我有一个分布式应用程序,它使用MPI_Reduce()进行某些通信。在精度方面,我们使用16位float(半精度)得到完全准确的结果。要加速通信(减少数据移动量),有没有办法在16位float上调用MPI_Reduce()?(我查看了MPI文档,没有看到任何关于16位float的信息。) 最佳答案 MPI标准在其内部数据类型中仅定义了32位(MPI_FLOAT)或64位(MPI_DOUBLE)float。但是,您始终可以创建自己的MPI_Datatype和您自己的自定义归约操作。下面的代码给出了一些关于如何执行此操作的粗略概念。由于

c++ - std::string 到 float (通过 std::stof)精度

我正在尝试解决这个问题,市场数据以字符串形式返回货币值,该字符串在数字长度后8位。money="124.19000540"我需要它是124.19,知道如何实现吗?std::stof(money)=124.19000244如何克服这个问题? 最佳答案 浮点类型不适合保存货币值。如果您满足于四舍五入到美分,并将钱存储为美分的整数(这是最简单的解决方案之一),您可以这样做:longnumCents=static_cast(100*std::stof(money))这将进行“截断”舍入,它总是向下舍入。如果您想“四舍五入到最接近的美分”,请

c++ - 深度神经网络的图像识别精度,float 还是 double?

用于图像识别的神经网络可能非常庞大。可以有数千个输入/隐藏神经元,数百万个连接什么的会占用大量计算机资源。同时float通常是32位和doublec++64位,它们在速度上没有太大的性能差异,但使用float可以节省一些内存。有一个神经网络正在使用什么sigmoid作为激活函数,如果我们可以选择神经网络中的哪些变量可以是float或double哪个可以float以节省内存而不会使神经网络无法执行?虽然训练/测试数据的输入和输出绝对可以是float因为它们不需要double,因为图像中的颜色可以仅在0-255范围内,当归一化为0.0-1.0比例时,单位值为1/255=0.0039~1。隐

c++ - 如何使用 avx 指令将 float vector 转换为 short int?

基本上,我如何使用AVX2内在函数编写与此等效的内容?我们这里假设result_in_float是__m256类型,而result是shortint*或短整数[8]。for(i=0;i我知道可以使用__m256i_mm256_cvtps_epi32(__m256m1)内在函数将float转换为32位整数,但不知道如何将这些32位整数进一步转换为16位整数。而且我不仅想要那个,还想要将这些值(以16位整数的形式)存储到内存中,我想全部使用vector指令来完成。在互联网上搜索,我发现了一个名为_mm256_mask_storeu_epi16的内在函数,但我不确定这是否能解决问题,因为我找

javascript - C# 十进制到 C++ float 和 javascript 数字

我有一个用C#编写的TCP服务器。我必须编写两个客户端(c++和javascript)。我可以在c#客户端中反序列化十进制(16字节-128位),但我无法反序列化其他语言。小数不要太大,我可以使用float或double。序列化小数时:MemoryStreamcombinedMessage=newMemoryStream();decimald=2135102.06m;using(BinaryWriterwriter=newBinaryWriter(combinedMessage,encoding)){writer.Write(d);}byte[]message=combinedMess

c++ format cout with "right"and setw() for a string and float

我正在尝试格式化一个“cout”,它必须显示如下内容:Result$34.45金额($34.45)必须在右侧索引上,并带有一定数量的填充或在特定列位置结束。我尝试使用cout但是,它是为“$”字符串设置宽度,而不是为字符串加金额设置宽度。关于处理此类格式有什么建议吗? 最佳答案 您需要将"$"和值34.45组合成单独的字符串。像这样尝试:#include#include#include#includeusingnamespacestd;intmain(){stringstreamss;ss

c++ - timer_create 给出内存泄漏问题 "Syscall param timer_create(evp) points to uninitialised byte(s)"

structsigeventtimerEvent;memset(&timerEvent,0,sizeof(timerEvent));timerEvent.sigev_value.sival_int=0;timerEvent.sigev_value.sival_ptr=diaBase;timerEvent.sigev_notify=SIGEV_THREAD;timerEvent._sigev_un._sigev_thread._function=function;timerEvent._sigev_un._sigev_thread._attribute=NULL;timer_ttimer