Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Преобразование double во float, интересный вопрос

15K
17 апреля 2010 года
DragonHT
38 / / 02.08.2007
Привожу исходный код файла:
Код:
#include "rkf3.h"
#include <math.h>
#include <stdlib.h>
void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
    float *k1 = new float[n],
          *k2 = new float[n],
          *k3 = new float[n],
          *yp = new float[n],
          *a = new float[n],
          *b = new float[n];
    int i;
    while (t<tout) {
        F(t,y,yp);
        for (i=0; i<=n-1; i++){
            k1=h*yp;
            a=y+k1/2;
        }
        F(t+h/2, a ,yp);
        for (i=0; i<=n-1; i++){
            k2=h*yp;
            b=y+3*k2/4;
        }
        F(t+3*h/4, b ,yp);
        for (i=0; i<=n-1; i++){
            k3=h*yp;
            y=y+(2*k1+3*k2+4*k3)/9;
        }
        t=t+h;
    }
    delete[] k1, k2, k3, yp, a, b;
    return;
}

А вот варнинги от вижуалки к этому файлу
 
Код:
rkf3.cpp(20) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(22) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(25) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
rkf3.cpp(27) : warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data

Внимание вопрос: Окуда здесь такие варнинги если я здесь не объявляю/принимаю переменных типа double?
Очень интересно просто пипец.
Сразу для копетанов, я знаю что варнинги это не фатально, так что не надо понты нарезать, при разных коэфициентах в методе результат метода один и тотже, по этому я в непонимании этого мира пытаюсь сослаться на описанную в варнингах потерю данных.
262
17 апреля 2010 года
Iktomy
1.2K / / 11.10.2004
там, где явно указаны цифры, поставь индекс f. например:

было:
 
Код:
y=y+(2а*k1+3а*k2+4*k3)/9а;

сделали:
 
Код:
y=y+(2.0f*k1+3.0f*k2+4.0f*k3)/9.0f;


и варнинги исчезнут.
просто по молчанию цифры идудт как double для операций с плавающей точкой
15K
17 апреля 2010 года
DragonHT
38 / / 02.08.2007
Хмм тогда можно ещё один вопрос? Я меняю в паре мест коэфициенты (выделено жирным)и у меня не меняется результат работы метода, с чем это может быть связано?
Первый вариант
Цитата:
#include "rkf3.h"

#include <math.h>
#include <stdlib.h>

void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y-k1+2*k2;
}
F(t+h, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(k1+4*k2+k3)/6;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}



Второй вариант:

Цитата:
#include "rkf3.h"

#include <math.h>
#include <stdlib.h>

void rkf3(void (*F)(float t1, float * y1, float * dy1), int n, float h, float *y, float t, float tout)
{
float *k1 = new float[n],
*k2 = new float[n],
*k3 = new float[n],
*yp = new float[n],
*a = new float[n],
*b = new float[n];
int i;
while (t<tout) {
F(t,y,yp);
for (i=0; i<=n-1; i++){
k1=h*yp;
a=y+k1/2;
}
F(t+h/2, a ,yp);
for (i=0; i<=n-1; i++){
k2=h*yp;
b=y+3*k2/4;
}
F(t+3*h/4, b ,yp);
for (i=0; i<=n-1; i++){
k3=h*yp;
y=y+(2*k1+3*k2+4*k3)/9;
}
t=t+h;
}
delete[] k1, k2, k3, yp, a, b;
return;
}

15K
17 апреля 2010 года
DragonHT
38 / / 02.08.2007
Спасибо за ответ.
тему можно закрывать ответ найден
я м#дак....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог