RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题

全部问题

Martin Hope
Direct
Asked: 2020-09-21 04:55:12 +0000 UTC

使用泛型时,将数字转换为字符串不会引发 ClassCastExeption - 为什么?

  • 19

你能解释一下为什么//(?!)没有在行中抛出 ClassCastExeption 异常吗?There (T)is , where T=String, 这意味着 there (String) new Integer(42), 应该抛出异常...... JVM 应该转换类型,但由于某种原因它没有。然后我们看看类型t,看看Integer什么是真正的类型t。但是我们推断类型的事实表明没有抛出异常。然后程序在调用函数的地方抛出异常A.<String>f()。

顺便一提!我记得 Bruce Eckel 教过有一些 javap 反编译器,他自己使用字节码或 .class 编写程序代码……我没有研究它。如果有人精通这一点,请尝试让反编译器构建这段代码,也许它会显示那里真正发生了什么,为什么?

public class A {
    public static <T> T f() {
        T t = (T) new Integer(42); // (?!) ЧТО ЧЁРТ ВОЗЬМИ ЗДЕСЬ ВООБЩЕ ПРОИСХОДИТ?!
        System.out.println(t.getClass());
        return t;
    }

    public static void main(String[] args) {
        System.out.println(A.<String>f()); // как здесь возможно исключение? ахаха, вы серьёзно?
    }
}

新:
所以,朋友们。最常见的答案是,方法f()是已编译为常规方法的常规方法,但考虑到其调用结果被强制转换为传递为的类型这一事实<NameOfTheClass>。一切似乎都已经很好了,这个答案可以被接受,但如果它在 Java 中真的像这样工作......关键是你可以main(String[])尝试调用更具爆炸性的东西:

System.out.println(A.<Double>f());

令人惊讶的是,控制台会输出:

//output:
class java.lang.Integer
42

所以如果我们让它不可见,它看起来像这样:

System.out.println((Double)A.<Double>f()); 

然后尝试编译它 - 会出现错误啊哈哈哈,从那里得出的结论是它不能完全一样......

我对此的猜测是该方法println()被重载,并且在A.<String>f()它选择版本println(String arg)的情况下,并且在A.<Double>f()它理解Double没有版本并设置println(Object arg)它的情况下,因为对于我们的, 42 被(Object)Integer(42)调用.toString()并显示。

对我来说,奇怪的是,由于某种原因,在第一种情况下,当我们调用A.<String>f()它时,这里的许多人认为它是这样调用(String)A.<String>f()的,从它设置版本的位置开始println(String arg),而第二次调用时A.<Double>f(),它确实如此没有尝试这样做(Double)A.<Double>f(),它立即选择了println(Object arg)...。

您想说整个技术非常智能,如果println()成功检查参数化/泛型函数的返回是否作为重载方法中的参数存在,则不会调用强制转换[例如,String版本println()存在,是的,让我们将输出转换Object为A.f()指定的String],如果重载版本没有在类的类型参数中指定版本A.f(),println()那么它(编译器)离开版本println(Object)并决定不尝试(Object)(Double)A.<Double>f()做是结果f()本身Object吗?

总计:我想要解释参数化方法(类)是如何工作的,这样的解释是编译器对生成代码的操作的算法是清楚的。如果我对编译器操作的一些猜测是正确的,那么我希望他们(我的猜测)得到确认,并且非常希望(!)带有指向一些文档文件的链接!

java
  • 4 个回答
  • 10 Views
Martin Hope
wololo
Asked: 2020-09-05 07:03:17 +0000 UTC

在 C++ 中表示有符号整数的方法

  • 19

语言标准规定整数类型可以用以下三种方式之一表示:

  • 2的补码,
  • 1的补码,
  • 有符号值。

在这方面,出现了几个问题:

  1. 现在除了2 的补码以外的整数表示吗?

  2. 该标准是否允许在同一实现中对整数类型进行不同的表示?例如,什么char是2 的补码和1int的补码?

  3. 整数的不同表示如何与按位运算一致?例如,让我们有这样的代码:

    unsigned char a = 1;    
    a = ~a;
    

并让一些实现使用 8 位char和 16位,并使用1 的补码int来表示有符号整数,即 我们在反向代码中存储负值。我的印象是可以进行以下转换来计算变量的值:a

  1. 该变量将a进行整数扩展为int,因为根据标准,位否定操作数可以扩展。那些。位集00000001转换为00000000 00000001.
  2. 将发生位反转,即 扩展值变为11111111 11111110。
  3. 此位序列将被解释为有符号整数,因为根据标准,位否定的结果是扩展操作数类型。反向代码中的这个位序列表示一个整数-1。
  4. 整数-1将被转换为无符号整数unsigned char模256。那些。该变量a将采用值255,该值由以下位序列编码:11111111。这有点奇怪,因为通过按位否定位序列00000001,我希望得到11111110,而不是11111111。

这种位否定是标准允许的,还是上面的例子根本错误?

c++
  • 1 个回答
  • 10 Views
Martin Hope
user239133
Asked: 2020-08-19 04:18:14 +0000 UTC

用两条弧近似替换三次贝塞尔曲线

  • 19

你好。我的旧图形框架 (GD) 无法绘制三次贝塞尔曲线(它根本无法绘制)。为了从 TTF 字体中绘制字符(任务不允许直接使用它),我想以某种方式部分地用弧线替换贝塞尔曲线。但是怎么做?我不需要现成的科学作品(我知道它们存在并具有工业意义),它允许使用一组弧线使结果尽可能准确地接近贝塞尔曲线。两条弧线对我来说就足够了。

这是我所拥有的: 在此处输入图像描述

点 P1 和 P2 的坐标是已知的。控制点 C₁ 和 C₂ 也是如此。从点 P1 和 P2 我画出垂直于红色线段 P1C1 和 P2C2 的直线。所需弧的中心将位于这些线上,否则点 P 1 和 P 2 处的切线将不重合,并且违反了问题的条件。

然后我决定这样做。通过点 P₁ 和 P₂ 之间的中点 P₀,我画了一条垂直于它们之间的线段的直线(灰色),然后是“灰色垂直线”。然后我添加第一个圆圈(绿色):

在此处输入图像描述

可以看出,根据它的半径R1,它的中心简单地沿着红色直线“行进”,而与灰色垂线的交点和交角发生变化。

一切都与半径为 R₂(蓝色)的第二个圆相似:在此处输入图像描述

所以,我需要找到半径R₁和R₂的这样的值,使两个圆与灰色垂线相交于一点,此外,它们在这一点具有相同的切角。然后我会以某种方式自己将它们切成弧形。

也就是说,初始数据是P1,P2,C1,C2,其坐标(x,y)是已知的。你需要找到 R₁ 和 R₂(圆半径,标量数)。

我不能再用一堆三角函数分别求解带有 X 和 Y 的方程。也许在向量代数的帮助下,这会更容易、更优雅地解决?

对于这个问题,我自己已经做了什么。当预先知道第一个弧的半径时,我解决了一个稍微不同的问题。

<?php

$width = 600;
$height = 600;

function demo($im) {

    $x1 = 124;
    $y1 = 253;
    imagefilledarc($im, $x1, $y1, 10, 10, 0, 0, 0x000000, 0);
    imagestring($im, 2, $x1-30, $y1+10, "x1, y1", 0x000000);

    $x2 = 445;
    $y2 = 428;
    imagefilledarc($im, $x2, $y2, 10, 10, 0, 0, 0x000000, 0);
    imagestring($im, 2, $x2+0, $y2+10, "x2, y2", 0x000000);

    imageline($im, $x1, $y1, $x2, $y2, 0x000000);

    $xc1 = $x1 + 50;
    $yc1 = $y1 - 200;
    imageline($im, $x1, $y1, $xc1, $yc1, 0x000000);
    imagefilledarc($im, $xc1, $yc1, 10, 10, 0, 0, 0x000000, 0);

    $xc2 = $x2 -5;
    $yc2 = $y2 -200;
    imageline($im, $x2, $y2, $xc2, $yc2, 0x000000);
    imagefilledarc($im, $xc2, $yc2, 10, 10, 0, 0, 0x000000, 0);

    $d1 = 10 * sqrt( pow($x1-$xc1, 2) + pow($y1-$yc1, 2) );
    $ac1 = atan2($yc1-$y1, $xc1-$x1);
    $ap1 = $ac1 + pi() / 2.;
    $xp1 = $x1 + $d1*cos($ap1);
    $yp1 = $y1 + $d1*sin($ap1);
    imageline($im, $x1, $y1, $xp1, $yp1, 0x808080);

    $d2 = 10 * sqrt( pow($x2-$xc2, 2) + pow($y2-$yc2, 2) );
    $ac2 = atan2($yc2-$y2, $xc2-$x2);
    $ap2 = $ac2 - pi() / 2.;
    $xp2 = $x2 + $d2*cos($ap2);
    $yp2 = $y2 + $d2*sin($ap2);
    imageline($im, $x2, $y2, $xp2, $yp2, 0x808080);


    /** Принудительно задается радиус первой (красной) дуги, что неправильно!!! */
    $r1 = 135;
    /** Из него вычисляется положение центра красной дуги, обозначен красной точкой. */
    $r1x = $x1 + $r1*cos($ap1);
    $r1y = $y1 + $r1*sin($ap1);
    imagefilledarc($im, $r1x, $r1y, 10, 10, 0, 0, 0xFF0000, 0);
    imagestring($im, 2, $r1x-40, $r1y-30, "r1x, r1y", 0x000000);

    /** Это результат решения уравнения для заданного радиуса красной дуги */
    $L = (
        2.*($r1x*$x2 + $r1y*$y2)
        - pow($x2, 2)
        - pow($y2, 2)
        - pow($r1x, 2)
        - pow($r1y, 2)
        + pow($r1, 2)
    ) / 2. / (
        cos($ap2)*($x2-$r1x)
        + sin($ap2)*($y2-$r1y)
        + $r1
    );

    $xl = $x2 + $L*cos($ap2);
    $yl = $y2 + $L*sin($ap2);

    imagefilledarc($im, $xl, $yl, 10, 10, 0, 0, 0x00FF00, 0);

    $aspl = atan2($r1y-$yl, $r1x-$xl);

    imagearc($im, $r1x, $r1y, 2*$r1, 2*$r1, rad2deg($ap1)+180, rad2deg($aspl), 0xFF0000);
    imagearc($im, $xl, $yl, 2*$L, 2*$L, rad2deg($aspl), rad2deg($ap2)-180, 0x0000FF);

}

$im = imagecreatetruecolor($width, $height);
imagefilledrectangle($im, 0, 0, $width-1, $height-1, 0xc0c0c0);

demo($im);

header('Content-Type: image/png');
imagepng($im, null, 9);

在此处输入图像描述

在这种情况下,第一条弧线是红色的。但这不是所需要的。我需要弧之间的某种“奇偶性”,而不是第一个弧的半径是强制的。

我要开始比赛了。因此,为了不误导参与者,我现在将陈述我自己过去一段时间得出的结论。

在此处输入图像描述

我从它应该通过的任何点(Xz,Yz)的坐标中得到了圆半径的公式:

            (Xz-X₁)² + (Yz-Y₁)²
R₁ = 2 ---------------------------
         (Xz-X₁)Cosβ + (Yz-Y₁)Sinβ

            (Xz-X₂)² + (Yz-Y₂)²
R₂ = 2 ---------------------------
         (Xz-X₂)Cosγ + (Yz-Y₂)Sinγ


然后我指定横坐标轴和1) 点 P₁ - β 的红色垂直线之间的角度(不在图片中)
2) 点 P₂ - γ 的红色垂直线
3) 点 P₀ - δ 的灰色垂直线
(我保留了角度 α 以防直线 P₁P₂ 的斜率,但不需要)。

此外,在点(Xz,Yz)处增加了切圆相等的条件。它只是意味着(Xz,Yz),(Xr1,Yr1)和(Xr2,Yr2)位于同一条线上。简单比例:

Xz - Xr₁   Xz - Xr₂
-------- = --------
Yz - Yr₁   Yz - Yr₂

然后我用与其他点的角度和距离来表示点的坐标:

Xz = X₀ + ZCosδ
Yz = Y₀ + ZSinδ
Xr₁ = X₁ + R₁Cosβ 
Yr₁ = Y₁ + R₁Sinβ
Xr₂ = X₂ + R₂Cosγ
Yr₂ = Y₂ + R₂Sinγ

结果是:

具有三个未知(R1、R2、Z)的方程组:

            (Xz-X₁)² + (Yz-Y₁)²
R₁ = 2 ---------------------------
         (Xz-X₁)Cosβ + (Yz-Y₁)Sinβ

            (Xz-X₂)² + (Yz-Y₂)²
R₂ = 2 ---------------------------
         (Xz-X₂)Cosγ + (Yz-Y₂)Sinγ

Xz - Xr₁   Xz - Xr₂
-------- = --------
Yz - Yr₁   Yz - Yr₂

Xz = X₀ + ZCosδ
Yz = Y₀ + ZSinδ
Xr₁ = X₁ + R₁Cosβ 
Yr₁ = Y₁ + R₁Sinβ
Xr₂ = X₂ + R₂Cosγ
Yr₂ = Y₂ + R₂Sinγ

此外,所有这些正弦和余弦通常都是常数,因为角度(它们的参数)是作为常数给出的。

一旦我扭曲了这个系统。打开括号,使用计算机代数(Maxima 程序),包括部分结果。事实证明,没有解析解。而且数值方法不适合,因为我打算用弧线从字体中绘制符号,你能想象它会以什么速度出现。

因此,宣布比赛。只有问题的标题很重要。然后我们根据需要做出决定,只是分析性的。注意我在文本中所说的所有废话是没有必要的,而且可能是有害的。

PS,除其他外,我对基于弧(半径)之间的某种关系的“奇偶校验”感兴趣。用给定的半径制作一个小圆圈并将第二个“附加”到它 - 这已经在问题的文本中完成了。

顺便说一下,这里是 R₂ 的负值。基于前两个公式在 PHP GD 中渲染,没有任何附加条件:

在此处输入图像描述

也就是说,与灰色垂线相交的圆与点 P₀ 相交的距离没有限制。

在这里,以防万一,谁需要它,点 P1、P2 以及需要它的控制点 C1 和 C2 上的三次贝塞尔曲线,用红色虚线表示:

在此处输入图像描述

它不需要近似,而是简单地替换为基于两条弧线的平滑值。

我会在问题中添加动画,否则很少关注它。

在此处输入图像描述

$r2 = .5 * (pow($r1, 2.) - pow($x2-$r1x, 2.) - pow($y2-$r1y, 2.)) /
    (cos($ap2)*($x2-$r1x) + sin($ap2)*($y2-$r1y) + $r1);

$ap2 就是 P2 处切线的垂线。

любой-язык
  • 2 个回答
  • 10 Views
Martin Hope
KAGG Design
Asked: 2020-07-08 15:29:47 +0000 UTC

如何在您的 WordPress 主题中正确包含样式表?

  • 19

style.css开发自己的主题时是否需要包含样式文件,还是自动发生?

wordpress
  • 3 个回答
  • 10 Views
Martin Hope
Dmitriy Chistyakov
Asked: 2020-03-31 12:38:04 +0000 UTC

Java和C#计算三角函数速度的区别

  • 19

sin我正在学习 Java,并对( cos) 方法的工作原理很感兴趣。我注意到在 j 上获取正弦的速度因函数参数而异。如果角度小于 0.785...rad,则计算速度很快,如果大于 - 则计算速度较慢。

与 C# 相比,结果恰恰相反:

在此处输入图像描述

以毫秒为单位检查 1000 万次正弦计算。
为什么会是这样的结果?


这是从 0 到 4*pi 的 java 余弦/正弦的结果:

在此处输入图像描述


public static void main(String[] args) {        
    long a;
    for (double x = 0; x < 4 * Math.PI; x = x + 0.05) {
        a = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            //Math.cos(x);
            Math.sin(x);
        }
        System.out.printf("%.6f, %d \n", x, (System.currentTimeMillis() - a));
    }
}

这是 C# 余弦/正弦从 0 到 4*pi 的结果:

在此处输入图像描述

public static void Main(string[] args)
    {
        for (double x = 0; x < 4 * Math.PI; x = x + 0.05) {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 10000000; i++) {
                Math.Cos(x);
                // Math.Sin(x);
            }
            sw.Stop();
            Console.WriteLine(x +" - " +(sw.ElapsedMilliseconds).ToString());
        }
    }
java
  • 1 个回答
  • 10 Views
上一页
下一页

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5