输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)相关的知识,希望对你有一定的参考价值。

c++的代码

参考技术A #include<stdio.h>
#include<math.h>

void main()

double x, y;
printf("请输入x和y坐标,用空格隔开 \n");
scanf("%lf%lf", &x, &y);

double l = sqrt(x * x + y * y);

printf("到原点的距离为: %.2lf\n", l);
追问

这句double l = sqrt(x * x + y * y);
C:\Documents and Settings\1k5-90-\桌面\MP4\df.c(10) : error C2143: syntax error : missing ';' before 'type'
错那了?

本回答被提问者采纳

将三个坐标 (x,y,z) 编码为一个整数或浮点数

【中文标题】将三个坐标 (x,y,z) 编码为一个整数或浮点数【英文标题】:Encode three coordinates (x,y,z) in one integer or float number 【发布时间】:2016-11-23 18:36:08 【问题描述】:

我在 C 中有一个程序,它使用 MPI 在进程之间发送 (x,y,z) 轴中特定点的坐标。因为发送的点是连续类型的(二维数组的行) ) 我想对存储在结构中的坐标进行编码

  Struct pnts

    int x;
    int y;
    int z;
  pnt;

在一个数字中(INTEGER/FLOAT)我需要对这三个坐标进行编码 坐标是区间 [0, 28] 中的整数 例如:x = 16, y = 2, z = 4 相对于 x y z

有什么想法吗?

【问题讨论】:

N=x*Max^2 + y*Max + z 你可以像这样对它们进行位移:int coordinates = x&lt;&lt;16 | y &lt;&lt; 8 | z @Eugene Sh.也许N=x*(Max+1)^2 + y*(Max+1) + zN=(x*(Max+1) + y)*(Max+1) + z 在 SO 上已经有很多类似的问题,例如:bit-packing-of-array-of-integers 或 using-1-int-to-send-2-numbers 按原样,这是@BeyelerStudios 突出显示的副本。但是我强烈需要强调的是,您不需要甚至不想对这个特定的用例进行位操作。正如您在另一个问题中所说,MPI 完全能够发送一个结构或其数组,并且现有的答案可以解释如何做到这一点。 【参考方案1】:

这是一件非常简单的事情,您需要将 3 个字节编码为 32 位整数,允许 4。所以您需要的是

int32_t coordinates;

coordinates = x | (y << 8) | (z << 16);

然后您可以使用位标志的掩码访问坐标。

测试程序:

#include <stdint.h>
#include <stdio.h>

int
main(void)

    int x = 16;
    int y = 2;
    int z = 4;
    int32_t coordinates = x | (y << 8) | (z << 16);

    fprintf(stdout, "x = %d\n", (coordinates & 0xFF));
    fprintf(stdout, "y = %d\n", ((coordinates >> 8) & 0xFF));
    fprintf(stdout, "z = %d\n", ((coordinates >> 16) & 0xFF));
    return 0;

但是你不能编码 256,因为它需要多一个位,记住你从 20 开始,所以你只能用 8 位表示 255,所以这里有一个想法

#include <stdint.h>
#include <stdio.h>

#define XSHIFT 0
#define YSHIFT 9
#define ZSHIFT 18

#define GET_X(x) (((x) >> XSHIFT) & 0x1FF)
#define GET_Y(y) (((y) >> YSHIFT) & 0x1FF)
#define GET_Z(z) (((z) >> ZSHIFT) & 0x1FF)
#define ENCODE(x, y, z) (((x) << XSHIFT) | ((y) << YSHIFT) | ((z) << ZSHIFT))

int
main(void)

    int32_t coordinates = ENCODE(256, 0, 1);

    fprintf(stdout, "x = %d\n", GET_X(coordinates));
    fprintf(stdout, "y = %d\n", GET_Y(coordinates));
    fprintf(stdout, "z = %d\n", GET_Z(coordinates));
    return 0;

在 32 位整数中使用剩余 8 位中的一个额外位。

注意:也许您(和其他人)认为定义XSHIFT 是多余的,但我认为这些表达式更有意义并且更易于阅读。这是我相信我从学习物理学中学到的东西,我很难在代码中看到像 x + 7 这样的东西,因为它是从物理定律得出的数学表达式。

【讨论】:

给定的范围是包容性的(这可能是问题,但无论如何)。 感谢您的回答!如果我想在数组中存储 32 位整数,这应该用一个字符数组来完成? 当然你可以使用char,虽然最好使用unsigned char。您可以在线阅读。 虽然这正确且很好地回答了 OP 的 Y 问题,但这完全没有认识到一开始就完全没有必要这样做。 MPI 完全有能力发送三个整数,无论​​是struct、数组还是其他。没有理由求助于位魔术,使用适当的抽象要好得多。这也是welldocumented 上的 SO,正如 OPs 关于此问题的其他问题所指出的那样。 @BillG,MPI 类型可以嵌套。只需为一个点创建一个结构类型,然后为一个点数组创建一个连续的类型。此外,连续的 MPI 类型只是为了方便 - 你不需要一个来发送数组。

以上是关于输入一个点坐标(两个浮点数),输出其到坐标原点的距离(保留2位有效数字)的主要内容,如果未能解决你的问题,请参考以下文章

c语言程序设计,输入一个点的坐标,输出沿原点逆时针旋转90度得到的坐标

luogu P6247 [SDOI2012]最近最远点对 |随机化

luogu P6247 [SDOI2012]最近最远点对 |随机化

[CSP-S模拟测试]:Walker(数学)

Java构造重载求点与原点点与固定点点与点的距离

数学中一个点在直角坐标系中绕原点旋转90或180度后的坐标怎么求?