我正在为学校制作一个简单的视频游戏程序,我已经创建了一种方法,如果调用该方法,玩家将获得15个健康点.我必须保持最高100的健康状态,并且我现在有限的编程能力,我正在做这样的事情.
public void getHealed(){
if(health <= 85)
health += 15;
else if(health == 86)
health += 14;
else if(health == 87)
health += 13;
}// this would continue so that I would never go over 100
Run Code Online (Sandbox Code Playgroud)
我理解我的语法并不完美,但我的问题是,这可能是一个更好的方法,因为我还必须对损伤点做类似的事情,而不是低于0.
这称为饱和算术.
如果我有一个 64 位整数,我将其解释为一个包含 8 个元素的压缩 8 位整数数组。我需要1在处理溢出时从每个压缩整数中减去常量,而一个元素的结果不会影响另一个元素的结果。
我现在有这个代码并且它可以工作,但我需要一个解决方案来并行地减去每个打包的 8 位整数并且不进行内存访问。在 x86 上,我可以使用类似的 SIMD 指令psubb并行减去打包的 8 位整数,但我正在编码的平台不支持 SIMD 指令。(在这种情况下为 RISC-V)。
因此,我正在尝试执行SWAR(寄存器内的 SIMD)以手动取消 a 的字节之间的进位传播uint64_t,执行与此等效的操作:
uint64_t sub(uint64_t arg) {
uint8_t* packed = (uint8_t*) &arg;
for (size_t i = 0; i < sizeof(uint64_t); ++i) {
packed[i] -= 1;
}
return arg;
}
Run Code Online (Sandbox Code Playgroud)
我认为你可以用按位运算符来做到这一点,但我不确定。我正在寻找一种不使用 SIMD 指令的解决方案。我正在寻找一个非常便携的 C 或 C++ 解决方案,或者只是它背后的理论,这样我就可以实现我自己的解决方案。
在编译C或C++代码时,找出CPU架构最可靠的方法是什么?据我所知,不同的编译器有自己的一套非标准预处理器定义(_M_X86在MSVS中__i386__,__arm__在GCC 中等).
有没有一种标准的方法来检测我正在构建的架构?如果没有,是否有各种编译器的这种定义的综合列表的来源,例如包含所有样板#ifdef的标题?
我正在编写一些代码,其中包含以下内容:
double a = SomeCalculation1();
double b = SomeCalculation2();
if (a < b)
DoSomething2();
else if (a > b)
DoSomething3();
Run Code Online (Sandbox Code Playgroud)
然后在其他地方我可能需要做平等:
double a = SomeCalculation3();
double b = SomeCalculation4();
if (a == 0.0)
DoSomethingUseful(1 / a);
if (b == 0.0)
return 0; // or something else here
Run Code Online (Sandbox Code Playgroud)
简而言之,我有很多浮点数学正在进行,我需要对条件进行各种比较.我无法将其转换为整数数学,因为在这种情况下这样的事情毫无意义.
我以前读过浮点比较可能不可靠,因为你可以做这样的事情:
double a = 1.0 / 3.0;
double b = a + a + a;
if ((3 * a) != b)
Console.WriteLine("Oh no!");
Run Code Online (Sandbox Code Playgroud)
简而言之,我想知道:我如何可靠地比较浮点数(小于,大于,相等)?
我使用的数字范围大致是从10E-14到10E6,所以我确实需要使用小数字和大数字.
我已将此标记为语言无关,因为无论我使用何种语言,我都对如何实现此目标感兴趣.
我正在运行具有以下两行的批处理文件:
start C:\Users\Yiwei\Downloads\putty.exe -load "MathCS-labMachine1"
"C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow
Run Code Online (Sandbox Code Playgroud)
此批处理文件用于运行Xming应用程序,然后运行PuTTY应用程序,以便我可以通过SSH连接到我大学的计算机实验室.
但是,如果我运行它并且Xming尚未打开,一旦我从PuTTY终端退出,cmd窗口仍保持打开状态.只有当我已经运行Xming时,关闭PuTTY终端时才会关闭cmd窗口.我已经尝试添加exit到批处理文件的最后一行,但无济于事.
我很想知道如何将数字舍入到最接近的第十个整数.例如,如果我有:
int a = 59 / 4;
Run Code Online (Sandbox Code Playgroud)
以浮点计算的14.75; 如何将数字存储为"a"中的15?
我是linq to XML的新手.在构建了XDocument之后,如何获得它的OuterXml,就像使用XmlDocument一样.
我在Windows和Linux(x86-64)上运行程序.它使用相同的编译器(Intel Parallel Studio XE 2017)编译,具有相同的选项,Windows版本比Linux版本快3倍.罪魁祸首是对std :: erf的调用,在两种情况下都在英特尔数学库中解析(默认情况下,它在Windows上动态链接,在Linux上静态链接,但在Linux上使用动态链接可以提供相同的性能).
这是一个重现问题的简单程序.
#include <cmath>
#include <cstdio>
int main() {
int n = 100000000;
float sum = 1.0f;
for (int k = 0; k < n; k++) {
sum += std::erf(sum);
}
std::printf("%7.2f\n", sum);
}
Run Code Online (Sandbox Code Playgroud)
当我使用vTune分析这个程序时,我发现Windows和Linux版本之间的程序集有点不同.这是Windows上的调用站点(循环)
Block 3:
"vmovaps xmm0, xmm6"
call 0x1400023e0 <erff>
Block 4:
inc ebx
"vaddss xmm6, xmm6, xmm0"
"cmp ebx, 0x5f5e100"
jl 0x14000103f <Block 3>
Run Code Online (Sandbox Code Playgroud)
并在Windows上调用erf函数的开头
Block 1:
push rbp
"sub rsp, 0x40"
"lea rbp, ptr [rsp+0x20]"
"lea rcx, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个只支持32位单精度浮点运算的嵌入式硬件程序.但是,我实现的算法需要64位双精度加法和比较.我试图double使用两个元组的模块来模拟数据类型float.因此,a double d将被模拟为struct包含元组:(float d.hi, float d.low).
使用字典顺序进行比较应该是直截了当的.然而,添加有点棘手,因为我不确定应该使用哪个基数.应该是FLT_MAX吗?我怎样才能检测到携带?
如何才能做到这一点?
编辑(清晰度):我需要额外的有效数字而不是额外的范围.
我无法在Linux中找到conio.h的等效头文件.
在Linux中有getch()&getche()function功能吗?
我想制作一个开关盒基本菜单,用户只需按一个键即可提供选项,并且应该向前移动过程.按下他的选择后,我不想让用户按ENTER键.
c ×5
c++ ×4
.net ×1
algorithm ×1
assembly ×1
batch-file ×1
c# ×1
cmd ×1
comparison ×1
compile-time ×1
detection ×1
getc ×1
getch ×1
getchar ×1
icc ×1
if-statement ×1
int ×1
intel-vtune ×1
java ×1
linq-to-xml ×1
linux ×1
math ×1
precision ×1
rounding ×1
simd ×1
string ×1
swar ×1
x86-64 ×1
xml ×1